Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用内部联接时绑定占位符变量的PDO异常问题_Php_Mysql_Pdo - Fatal编程技术网

Php 使用内部联接时绑定占位符变量的PDO异常问题

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

我对我的PDO声明有异议。我在其他SQL语句中使用占位符/绑定,它们都可以正常工作。所以我不知道为什么这一次它不起作用

一个数组被传递给函数,如果键存在,我会将数据附加到SQL行

当我使用占位符
: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查询不包含任何参数时才能执行。

我觉得自己像个白痴。这一直都在我的脸上。非常感谢。