【发布时间】:2019-08-04 03:29:43
【问题描述】:
我正在尝试使用插入值数组在我的数据库上使用准备好的语句在php 中删除SELECT。目前我使用存储过程,我的代码看起来像这样:
$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();
这很好,但目前我想摆脱我的存储过程并在php 中执行所有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 = :isActive
AND tup.id_user_fk = :getUser"
);
$stmt->execute(array(
":getUser" => $user_id,
":isActive" => $is_active)
);
$result = $stmt->get_result();
当我运行此脚本时,我收到以下错误:
未捕获的 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();
这也有效。似乎:getUser 和:isActive 的绑定似乎不起作用,尽管我从 php.net 遵循了这个示例:
/* 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));
我在 XAMPP 3.2.2 上运行。
对此有什么想法吗?
【问题讨论】:
-
看起来你试图使用 PDO 在 mysqli 应用程序中使用命名参数的能力。
-
mysqli_不像 PDO 那样支持命名占位符。要么使用 PDO 连接/查询方法,要么使用?作为占位符。 -
@Qirel 实际上错过了这一点。
Uncaught mysqli_sql_exception所以现在根本没有假设。我将删除我的愚蠢问题:) -
@NigelRen。确实是我的错。感谢您指出这一点!