【发布时间】:2021-06-05 21:13:12
【问题描述】:
我一直在使用 PHP 开发数据库管理页面。最近我完成了这个页面,并且正在处理安全方面的工作,但我的第一个 SQL 查询遇到了问题。它没有准备好,可能有空输入。当我尝试使用下面的代码来准备它时,它给出了一个错误。
$id_query = "SELECT sp.name as name, sp.sku_id as sku_id, sp.id as prod_id FROM shop_product as sp WHERE scanbarcode_barcode='?';";
$stmt1 = $conn->prepare($id_query);
$stmt1->bind_param("s", $barcode);
$stmt1->execute();
$result1 = $stmt1->get_result();
$stmt1->close();
据我了解,这是因为它没有将 '?' 识别为参数绑定的位置。
然后我尝试了以下代码:
if(isset($_GET["barcode"])) {
$barcode = $_GET["barcode"];
}else{
$barcode = "";
}
# array definition using $barcode
if(isset($_GET["barcode"])) {
$id_query = "SELECT sp.name as name, sp.sku_id as sku_id, sp.id as prod_id FROM shop_product as sp WHERE scanbarcode_barcode=?;";
$stmt1 = $conn->prepare($id_query);
$stmt1->bind_param("s", $barcode);
}else{
$id_query = "SELECT sp.name as name, sp.sku_id as sku_id, sp.id as prod_id FROM shop_product as sp WHERE scanbarcode_barcode='';";
$stmt1 = $conn->prepare($id_query);
}
$stmt1->execute();
$result1 = $stmt1->get_result();
$stmt1->close();
$result1 = mysqli_fetch_assoc($result1);
页面无法加载。
我正在使用 Xampp localhost Apache 和 MySQL 服务器。
如果我不使用最后一行 $result1 = mysqli_fetch_assoc($result1);,它会在后面的行中失败,因为它无法将 mysqli_result 解释为数组。 (下一行是一个while循环,这里没有显示,因为它无关紧要)
我考虑过只添加一些检查(传入的唯一内容是 EAN13 条形码,并使用正常
$result1 = mysqli_query($conn, $id_query);
$result1 = mysqli_fetch_assoc($result1);
但更喜欢使用准备好的语句。
注意:如果我 print_r() $result1 在使用 mysqli_fetch_assoc() 之前,我会得到 ~960 行。在我尝试准备声明之前,它运行良好且快速。
要求的最小可重复示例:
<form action="dash.php" method="get">
Barcode: <input type="text" name="barcode">
<input type="submit">
</form>
<?php # Gets info about the product
$conn = mysqli_connect($hostname, $username, $password, $database);
if(isset($_GET["barcode"])) {
$barcode = $_GET["barcode"];
}else{
$barcode = "";
}
if(isset($_GET["barcode"])) {
$id_query = "SELECT sp.name as name, sp.sku_id as sku_id, sp.id as prod_id FROM shop_product as sp WHERE scanbarcode_barcode=?;";
$stmt1 = $conn->prepare($id_query);
$stmt1->bind_param("s", $barcode);
}else{
$id_query = "SELECT sp.name as name, sp.sku_id as sku_id, sp.id as prod_id FROM shop_product as sp WHERE scanbarcode_barcode='';";
$stmt1 = $conn->prepare($id_query);
}
$stmt1->execute();
$result1 = $stmt1->get_result();
$result1 = mysqli_fetch_assoc($result1);
var_dump($result1);
$stmt1->close();
【问题讨论】:
-
如果在未设置
$_GET['barcode']时设置$barcode = '',则不需要两个版本的查询。 -
你可以回到原来的代码,只是不要在
?周围加上引号。那是你最初的问题。 -
这不可能。
-
如果留空,
$_GET['barcode']将被设置为空字符串。 -
请更新相关代码并向我们展示正确的minimal reproducible example。我在我的机器上尝试了相同的代码,它工作得很好。
标签: php mysql mysqli prepared-statement