开发者社区 问答 正文

如何在准备好的声明中在数组中传递字符串

我正在创建准备好的语句并出现错误

错误号:1064

您的SQL语法有误;查看与您的MySQL服务器版本相对应的手册,以获取在'1附近使用的正确语法

我的代码:


    $sql="SELECT * FROM   table_name  where status=1 ? GROUP BY el_cs_heading ORDER BY el_date DESC limit ?,?";

    $query = $this->db->query($sql,array($condition,(int)$offset,(int)$limit)); 

我在条件即将查询之前得到单引号..请帮助

展开
收起
社区秘书 2019-11-19 14:34:03 639 分享
分享
版权
举报
阿里云 AI 助理回答

错误号1064通常意味着SQL语句中存在语法错误。在您提供的代码片段中,问题可能出在您如何构造查询字符串以及如何使用参数化查询上。在PHP的MySQLi或PDO等数据库交互扩展中,参数化查询是用来防止SQL注入的安全做法,但它们的用法需要正确嵌入到SQL字符串中。

您的SQL字符串中有两个地方需要注意:

  1. 您似乎想在WHERE子句中动态插入一个条件,但是您直接在SQL字符串中放置了问号(?),这在SQL字符串中是不正确的。如果$condition是要动态添加到WHERE子句中的条件,那么应该正确地将其与其它条件结合。

  2. 参数化查询中的问号应当直接用于替换值,而不是像您那样在字符串中直接写出。这意味着您不应该在GROUP BYORDER BY后面直接写入问号。

修正后的代码示例(假设您使用的是支持参数化查询的方式,比如PDO或MySQLi的预处理语句)可能是这样的:

// 假设$db是一个已经建立好的数据库连接对象

// 如果$condition不是一个简单的值比较,而是更复杂的逻辑,
// 需要根据实际情况调整此处的SQL字符串构建方式。
$sql = "SELECT * FROM table_name WHERE status=1";
if (!empty($condition)) {
    $sql .= " AND {$condition}";
}
$sql .= " GROUP BY el_cs_heading ORDER BY el_date DESC LIMIT ?, ?";

// 准备语句
$stmt = $db->prepare($sql);

// 绑定参数
$stmt->bindParam(1, (int)$offset, PDO::PARAM_INT); // 第一个?的位置
$stmt->bindParam(2, (int)$limit, PDO::PARAM_INT);  // 第二个?的位置

// 执行查询
$stmt->execute();

// 获取结果,具体方法取决于你使用的数据库交互扩展
$results = $stmt->fetchAll();

请注意,这个示例假设您使用的是PDO进行数据库操作。如果您使用的是其他库(如MySQLi),绑定参数的方法会有所不同,但基本思路是一致的:先构建正确的SQL字符串,然后安全地绑定参数值。务必确保您的实际代码与所使用的数据库访问库相匹配。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等