Php 使用内部联接时绑定占位符变量的PDO异常问题
我对我的PDO声明有异议。我在其他SQL语句中使用占位符/绑定,它们都可以正常工作。所以我不知道为什么这一次它不起作用 一个数组被传递给函数,如果键存在,我会将数据附加到SQL行 当我使用占位符Php 使用内部联接时绑定占位符变量的PDO异常问题,php,mysql,pdo,Php,Mysql,Pdo,我对我的PDO声明有异议。我在其他SQL语句中使用占位符/绑定,它们都可以正常工作。所以我不知道为什么这一次它不起作用 一个数组被传递给函数,如果键存在,我会将数据附加到SQL行 当我使用占位符:categories\u slug时,我得到一个错误: SQLSTATE[42000]:语法错误或访问冲突:1064您有 SQL语法错误;检查与您的产品相对应的手册 MySQL服务器版本,以便在附近使用正确的语法 ':categories\u slug-internal-job\u-types ON-j
:categories\u slug
时,我得到一个错误:
SQLSTATE[42000]:语法错误或访问冲突:1064您有
SQL语法错误;检查与您的产品相对应的手册
MySQL服务器版本,以便在附近使用正确的语法
':categories\u slug-internal-job\u-types ON-jobs.post\u-type\u-id=
第12行时的作业类型id
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);
这就是问题所在:
$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查询不包含任何参数时才能执行。我觉得自己像个白痴。这一直都在我的脸上。非常感谢。