【问题标题】:Creating a Dynamic Product Page in PHP [duplicate]在 PHP 中创建动态产品页面 [重复]
【发布时间】:2021-01-24 05:28:37
【问题描述】:

我正在尝试从数据库中提取数据并使用设置的变量将其导出为 HTML。它每次都给我未定义的变量。我假设是因为数据丢失?我与主机和数据库建立了良好的连接,因为我已经在它们上运行了测试脚本。无论如何,这是代码:

更新:感谢您的及时回复,遗憾的是仍然没有太多运气。我返回了 $id 分配,将其遗漏是偶然的,我尝试过使用和不使用 while 循环;我还尝试定义默认变量。似乎没有任何效果。我不断收到“缺少呈现此页面的数据,除非我从代码中删除该错误,否则我会收到未定义的变量错误。任何人有任何最终想法吗?我是 SQL 的新手,所以你们可能很愚蠢太聪明了,想都不敢想。

<?php if (isset($_GET['id'])) {
    include "storescripts/connect_to_mysql.php";    $id = preg_replace('#[^0-9]#i', '', $_GET['id']);   $sql = mysqli_query("SELECT * FROM products WHERE id='$id' LIMIT 1");   $productCount = mysqli_num_rows($sql);
    if ($productCount > 0) {        while($row = mysqli_fetch_array($sql)){ 
             $product_name = $row["product_name"];
             $price = $row["price"];
             $details = $row["details"];
             $category = $row["category"];
             $subcategory = $row["subcategory"];
         }
            } else {        echo "That item does not exist.";
        exit();     }        } else {   echo "Data to render this page is missing.";    exit(); } ?>

【问题讨论】:

  • 由于您在while循环中定义了变量,因此只有在数据库中有匹配项时才会定义它们。如果没有匹配项,则不会创建变量,如果您仍然尝试使用它们,您将获得undefined variable: xxx。在 while 循环之前为它们定义默认值,或者在回显它们时检查它们是否已定义,如下所示:echo $product_name ?? 'default-value';。如果定义了 $product_name 并且不为空,则将回显默认值。
  • 使用准备好的语句来避免sql注入。
  • 如果$_GET['id'] 未设置,@MagnusEriksson 所说的内容也适用。

标签: php html sql variables dynamic


【解决方案1】:

由于您的查询将只返回一个结果(查询中的限制 = 1),您应该取消 while 循环。

只有在迭代不止一行时才需要它。

while循环中声明的变量在循环外总是未定义的。

if ($productCount > 0) {
    // get all the product details
         $product_name = $row["product_name"];
         $price = $row["price"];
         $details = $row["details"];
         $category = $row["category"];
         $subcategory = $row["subcategory"];
         $date_added = strftime("%b %d, %Y", strtotime($row["date_added"]));   
}

【讨论】:

  • 你为什么还用strtotime()
  • 听起来建议,但这不是 OP 询问的问题
【解决方案2】:

尝试在 while 循环中使用 $row = mysqli_fetch_assoc($sql) 而不是 $row = mysqli_fetch_array($sql)。 如果我没记错的话mysqli_fetch_array() 函数返回一个数字数组,但你需要得到一个关联数组。

【讨论】:

  • mysqli_fetch_array 两者都返回
【解决方案3】:
 $sql = mysqli_query($connect, "SELECT * FROM products WHERE id='$id' LIMIT 1");

错过了为“$id”赋值,你得到了 id 的值,但它没有赋值给 $id

$id=$_GET['id'];
$sql = mysqli_query($connect, "SELECT * FROM products WHERE id='$id' LIMIT 1");

在 sql 查询上面添加这个

【讨论】:

  • 虽然关于那里的变量分配在技术上是正确的,但这并没有像 Magnus 的评论显示的那样提及其他人。不过更成问题的是,这段代码极易受到sql injection 的影响。你应该使用prepared statements with parameter binding
  • 我是 PHP 新手,任何服务器端语言我完全不知道 SQL 注入。我认为我工作的公司的数据存在风险。
猜你喜欢
  • 2019-07-31
  • 1970-01-01
  • 1970-01-01
  • 2022-12-03
  • 2019-11-07
  • 2019-12-28
  • 2022-07-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多