我的PDO声明有问题。我在其他SQL语句中使用占位符/绑定,它们都工作正常。所以我茫然地知道为什么这一次不起作用。
将数组传递给函数,如果键存在,则将数据附加到SQL行中。
使用占位符:categories_slug
时出现错误:
SQLSTATE [42000]:语法错误或访问冲突:1064您有一个 您的SQL语法错误;检查与您的手册相对应的手册 MySQL服务器版本可在附近使用正确的语法 ':categories_slug INNER JOIN job_types ON jobs.post_type_id = job_types.id位于第12行
slug变量仅包含字母a到z和破折号(-)。
如果我替换行
$sql .= ' && categories.slug = :categories_slug ';
具有硬编码的值:
$sql .= ' && categories.slug = \'business-admin\' ';
该语句执行得很好。
我在做什么错了?
这是完整的代码:
$db = static::getDB();
$sql = ' SELECT students.id,
students.slug,
students.title,
college.name AS college_name,
college.slug AS college_slug,
categories.name AS categories_name,
categories.slug AS categories_slug,
job_types.name AS job_types_name,
job_types.slug AS job_types_slug
FROM students ';
$sql .= ' INNER JOIN college ON students.college_id = college.id ';
$sql .= ' INNER JOIN categories ON students.category_id = categories.id ';
if (array_key_exists("categories.slug", $filters) && isset($filters['categories.slug'])) {
//THIS IS THE OFFENDING LINE ACCORDING TO THE ERROR
$sql .= ' && categories.slug = :categories_slug ';
}
$sql .= ' INNER JOIN job_types ON students.post_type_id = job_types.id ';
$sql .= ' WHERE students.deleted_at IS NULL ';
$stmt = $db->query($sql);
if(array_key_exists("categories.slug", $filters) && isset($filters['categories.slug'])){
$stmt->bindValue( ":categories_slug", $filters['categories.slug'], PDO::PARAM_STR );
}
return $stmt->fetchAll(PDO::FETCH_ASSOC);
答案 0 :(得分:3)
这是问题所在
$stmt = $db->query($sql);
当SQL包含参数占位符时,不能使用query()
。您必须使用prepare()
创建stmt。然后,您可以将变量绑定到参数并执行。
$stmt = $db->prepare($sql);
if(array_key_exists("categories.slug", $filters) && isset($filters['categories.slug'])){
$stmt->bindValue( ":categories_slug", $filters['categories.slug'], PDO::PARAM_STR );
}
$stmt->execute();
query()
函数是一种快捷键,可以同时准备和执行,但仅当SQL查询不包含任何参数时。