使用INNER JOIN时绑定占位符变量的PDO异常问题

时间:2018-08-16 19:23:57

标签: php mysql pdo

我的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);

1 个答案:

答案 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查询不包含任何参数时。