【问题标题】:PHP PDO passing id of row to urlPHP PDO 将行的 id 传递给 url
【发布时间】:2015-08-07 10:41:37
【问题描述】:

我需要帮助!对于我的生活,我无法弄清楚我做错了什么......我正在尝试构建一个简单的搜索脚本,它从 mysql 数据库返回一些结果,并且我希望能够从这些结果中单击每个单独的并将其传递到一个新页面,比如说 results.php,其中加载了该结果的详细信息,类似于我想的电子商务网站,显示产品的结果,单击一个,该产品并且其附加详细信息将加载到新页面中。我知道我需要将 id 传递到 url,但我一直遇到的问题是它只是将搜索结果中的最后一个 id 传递到 url ......但是在搜索结果中收集了所有正确的 id ...... ?

我对 php pdo 等非常陌生。我试图在网上找到一个解决方案,花了几天时间寻找,但我要么得到相同的结果,要么得到错误,这表明我没有做对.. . 无论如何,这是我目前所拥有的:

<?php

require('inc/connect/config.php');

$output = "";

if(!isset($_POST['search'])) {
$output = "";
}
if(isset($_POST['search'])) {
$search_query = $_POST['search'];
$search_query = preg_replace("#[^0-9a-z]#i", "", $search_query);

try {
    $query = $db->prepare('SELECT * FROM clients WHERE name LIKE "%' . $search_query . '%" OR town LIKE "%' . $search_query . '%"');
    $query->execute();

    while($r = $query->fetch(PDO::FETCH_ASSOC)) {
        $bname = $r['name'];
        $btown = $r['town'];
        $id = $r['id'];

        $output .= $bname . '<br>' . $btown . '<br>' . $id . '<br><br>';
    }
    if($query->rowCount() < 1) {
        $output = "no results found";
    }

} catch (PDOException $e) {
    echo "failed search";
}
}

?>

<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>search</title>
<link rel="stylesheet" href="css/style.css" />
</head>
<body>
<div style="padding: 20%; text-align: center;">
    <h3>search</h3>
    <p>or search by <a href="categories.php">category</a></p><br>

    <form method="post" action="search-test.php">
        <label>&lt;3 </label><input type="text" name="search" id="search" placeholder="search by brand or town..." style="width: 40%;"><br><br>
        <input type="submit" value="search">
    </form>
    <br>
    <a href="results.php?id=<?php echo $id; ?>"><?php echo $output; ?></a>
</div>


</body>

</html>

执行搜索时,返回的结果如下:

业务1
小镇
1

商业2
小镇
2

商业3
小镇
3

但是对于到 results.php 页面的 url 链接,它为每个结果分配 id 为 3...它只会将结果集中的最后一个 id 传递给 url...我做错了什么?请帮忙!!

提前致谢

【问题讨论】:

    标签: php mysql pdo


    【解决方案1】:

    $id 每次传递到 while 循环时都会被重写。所以,它的最终结果就是你的最后一个 id,没错。

    您的首选是将 SQL 结果存储到数组中,然后在视图上循环。您的第二个选择如下:

    替换:

    $output .= $bname . '<br>' . $btown . '<br>' . $id . '<br><br>';
    

    作者:

    $output .= "<a href=\"results.php?id=$id\">".$bname . '<br>' . $btown . '<br>' . $id . '</a><br><br>';
    

    还有:

    <a href="results.php?id=<?php echo $id; ?>"><?php echo $output; ?></a>
    

    作者:

    <?php echo $output; ?>
    

    【讨论】:

      【解决方案2】:

      首先,我建议重构一些当前代码,即如何准备语句。与其将参数直接包含在 prepare 语句中,不如将它们抽象为 params 方法;不这样做会破坏准备语句的目的,并使您面临 SQL 注入!

      $query = $db->prepare('SELECT * FROM clients WHERE name LIKE :query OR town LIKE :query');
      $params = array(':query' => '%' . $search_query . '%');
      $query->execute($params);
      

      其次,PHP PDO 有一个 fetchAll 方法,您可以对其进行迭代,而不是多次调用 fetch

      $results = $query->fetchAll(PDO::FETCH_ASSOC);
      if(count($results) < 1) {
          $output = "no results found";
      }
      else {
          for($results as $r) {
              $bname = $r['name'];
              $btown = $r['town'];
              $id = $r['id'];
      
              $output .= $bname . '<br>' . $btown . '<br>' . $id . '<br><br>';
          }
      }
      

      最后,回答你的错误:$id 会在你每次通过 while 循环时被重置,并以值 3 退出。然后,您将内容直接输出到 HTML,因此将简单地使用 $id 的当前值(并且链接将包装您的所有内容,而不是单独包装每个结果)。相反,我建议您将链接标签添加到循环中,以便为每个结果创建单独的链接:

      $output .= '<a href="results.php?id=' . $id . '">' . $bname . '<br>' . $btown . '<br>' . $id . '<br><br></a>';
      

      然后通过&lt;?php echo $output; ?&gt;简单地输出到HTML

      祝你好运!

      【讨论】:

      • 朱利安,你太棒了......我知道我需要做一些事情来帮助防止 SQL 注入,但我还没有研究过,所以谢谢!
      • @KayleeSmith 不用担心,熟能生巧!继续加油!
      【解决方案3】:

      结果页面的链接是&lt;a href="results.php?id=&lt;?php echo $id; ?&gt;"&gt;$id 的值是存在while 循环时的值。

      在循环中,您应该为每个结果生成一个链接,或者将所有 id 连接到一个 ids 参数中,然后传递给结果页面,例如:ids=1,2,3

      【讨论】:

        猜你喜欢
        • 2017-09-09
        • 2018-03-03
        • 2016-05-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-02
        相关资源
        最近更新 更多