我正在尝试使用插入值数组使用准备好的语句在数据库中定义一个SELECTin php。目前,我正在使用存储过程,我的代码看起来像这样:
$user_id = $user["id_user_key"];
$is_active = 1;
$stmt = $db->prepare("CALL spGetUserProducts(?, ?)");
$stmt->bind_param("ii", $user_id, $is_active);
$stmt->execute();
$result = $stmt->get_result();
Run Code Online (Sandbox Code Playgroud)
这工作得很好,但在现阶段,我想摆脱我的存储过程和做所有的SQL中php
我将上面的代码更改为此:
$user_id = $user["id_user_key"];
$is_active = 1;
$stmt = $db->prepare(
"SELECT
tp.id_product AS id,
tp.product_name AS pname,
tp.product_code AS pcode,
tp.product_icon AS picon
FROM
tbl_user_products tup
INNER JOIN
tbl_products tp
ON tp.id_product = tup.id_product_fk
WHERE
tup.active = :isActive
AND tup.id_user_fk = :getUser"
);
$stmt->execute(array(
":getUser" => $user_id,
":isActive" => $is_active)
);
$result = $stmt->get_result();
Run Code Online (Sandbox Code Playgroud)
当我运行此脚本时,出现以下错误:
mysqli_sql_exception异常:您的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册,以在第12行的':isActive AND tup.id_user_fk =:getUser'附近使用正确的语法
可以肯定的是,我也确实在没有参数绑定的情况下运行了SQL脚本,如下所示:
$user_id = $user["id_user_key"];
$is_active = 1;
$stmt = $db->prepare(
"SELECT
tp.id_product AS id,
tp.product_name AS pname,
tp.product_code AS pcode,
tp.product_icon AS picon
FROM
tbl_user_products tup
INNER JOIN
tbl_products tp
ON tp.id_product = tup.id_product_fk
WHERE
tup.active = 1
AND tup.id_user_fk = 1"
);
$stmt->execute();
$result = $stmt->get_result();
Run Code Online (Sandbox Code Playgroud)
这也有效。尽管我遵循了php.net的以下示例,但似乎绑定:getUser并:isActive似乎不起作用:
/* Execute a prepared statement by passing an array of insert values */
$calories = 150;
$colour = 'red';
$sth = $dbh->prepare('SELECT name, colour, calories
FROM fruit
WHERE calories < :calories AND colour = :colour');
$sth->execute(array(':calories' => $calories, ':colour' => $colour));
Run Code Online (Sandbox Code Playgroud)
我正在XAMPP 3.2.2上运行东西。
有什么想法吗?
您似乎正在使用mysqli_PHP代码库连接到数据库。MySQLi不支持命名参数。您没有说出示例的确切来源,但我想它是从与PDO库相关的页面中获得的。它们是不同的库,它们具有不同的(虽然看起来很相似,但是如果您没有仔细检查的话)函数名称和功能。
但是,没有什么阻止您继续使用支持的语法。您只需要切换提供参数的顺序即可使其与SQL中出现的顺序匹配。(或者当然,您也可以在SQL中切换WHERE子句的顺序,但是在这里,我已经切换了参数值的顺序。)
$stmt = $db->prepare(
"SELECT
tp.id_product AS id,
tp.product_name AS pname,
tp.product_code AS pcode,
tp.product_icon AS picon
FROM
tbl_user_products tup
INNER JOIN
tbl_products tp
ON tp.id_product = tup.id_product_fk
WHERE
tup.active = ?
AND tup.id_user_fk = ?"
);
$stmt->bind_param("ii", $is_active, $user_id);
$stmt->execute();
Run Code Online (Sandbox Code Playgroud)