【问题标题】:Php page not loading when using mysqli_fetch_assoc使用 mysqli_fetch_assoc 时未加载 PHP 页面
【发布时间】: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


【解决方案1】:

我想通了。是我有点愚蠢,使用了一堆 while 循环,最终不需要它们。该页面未加载,因为它正在执行无限的 while 循环。特别感谢 Dharman 和 Barmar 给我的想法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    相关资源
    最近更新 更多