php - 使用插入值数组执行准备好的语句不起作用
问题描述
我试图SELECT
在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();
这工作正常,但目前我想摆脱我的存储过程并做所有的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();
当我运行此脚本时,我收到以下错误:
未捕获的 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
尽管我从 php.net 遵循了这个示例,但似乎and的绑定: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));
我在 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();
推荐阅读
- python - 有没有办法控制使用 python 添加 PDF 书签的位置?
- r - 用矩阵泛化函数
- pandoc - 将html目录转换为markdown?Html 在一个父目录的多个文件夹中
- python - 如何使用 xbbg 下载刻度数据切片?
- facebook - 将 Google Tag Manager 连接到 Facebook,不会发布?
- python - 为什么这个对文件中的字符进行计数的函数总是返回 0?
- windows - 如果低于特定 Windows 版本,如何检查 Windows 版本并显示 MessageBox?
- python - 如何从python中的目录打印单个文件
- node.js - Firebase Admin SDK Node.js 在实时数据库中的块读取和写入
- node.js - 如何从 getServerSideProps 访问 NextJS 响应正文?