【问题标题】:PDO displaying data from database foreach specific IDPDO 显示数据库中每个特定 ID 的数据
【发布时间】:2015-05-29 19:44:05
【问题描述】:

如果会员登录他们有像 index.php?id=5 这样的 url

$id = $_GET['id']

我可以通过这样做显示用户数据

$pdo = Database::connect();
$sql = 'SELECT * FROM data WHERE id_member = "5" ORDER BY tgl DESC';                    
foreach ($pdo->query($sql) as $row) {
     echo '<td>'. $row['tgl'] . '</td>';    
}  

但如果我改成这个,什么都不会发生。

$pdo = Database::connect();
$q = $pdo->prepare('SELECT * FROM data WHERE id_member = $id ORDER BY tgl DESC');    
$q->bindValue(':id', $id, PDO::PARAM_INT);

foreach ($pdo->query($q) as $row) {
    echo '<td>'. $row['tgl'] . '</td>';
}

但我不明白。 有人可以帮帮我吗?请给我正确的代码并解释一下,我是 PDO 的新手。

谢谢

【问题讨论】:

    标签: php pdo


    【解决方案1】:

    您不要将query 函数http://php.net/manual/en/pdo.query.phppreparehttp://php.net/manual/en/pdo.prepare.php 一起使用。 Prepareexecutehttp://php.net/manual/en/pdostatement.execute.php 一起使用。您还需要将绑定的名称放入查询中。

    $pdo = Database::connect();
    $q = $pdo->prepare('SELECT * FROM data WHERE id_member = :id ORDER BY tgl DESC');    
    $q->bindValue(':id', $id, PDO::PARAM_INT);
    $q->execute();
    while($q->fetch(PDO::FETCH_ASSOC)) {
        echo '<td>'. $row['tgl'] . '</td>';
    }
    

    $pdo = Database::connect();
    $q = $pdo->prepare('SELECT * FROM data WHERE id_member = ? ORDER BY tgl DESC');
    $q->execute(array($id));
    while($q->fetch(PDO::FETCH_ASSOC)) {
        echo '<td>'. $row['tgl'] . '</td>';
    }
    

    这两种方法都是准备好的语句。它们将用户的数据分开,因此不会导致您的查询出现问题。

    另外,正如其他答案所暗示的那样,如果您使用双引号,您的第二个查询将执行......但不要这样做,它会让您进入注射。这是你可以做到的,但准备得更好。还要注意将 $id 强制转换为 int 强制它是一个数字。

    $id = (int)$_GET['id'];
    $pdo = Database::connect();
    $sql = "SELECT * FROM data WHERE id_member = $id ORDER BY tgl DESC";
    foreach ($pdo->query($sql) as $row) {
         echo '<td>'. $row['tgl'] . '</td>';    
    }
    

    【讨论】:

      【解决方案2】:

      在您的语句中,您使用的是准备好的查询,因此您的查询应该看起来不同:

      $q = $pdo->prepare('SELECT * FROM data WHERE id_member = :id ORDER BY tgl DESC');
      

      您还必须在绑定参数后执行查询,如下所示:

      $q->execute();. 
      

      这样做应该可以解决您的问题:

      $pdo = Database::connect();
      $q = $pdo->prepare('SELECT * FROM data WHERE id_member = :id ORDER BY tgl DESC');
      $q->execute(['id'=>$id])                   
      foreach ($q as $row) {
        echo '<td>'. $row['tgl'] . '</td>';    
      }
      

      使用准备好的语句通常是更好的做法,因为它们可以防止 sql 注入攻击。

      【讨论】:

      • 哇,这个“单引号字符串不会被 PHP 评估”,我现在会仔细考虑引用,我忘记了。非常感谢
      • 这里有很多来自 Google 的流量。开幕海报早已不复存在,我们不得不想想那些来自谷歌的人。我自愿编辑此答案,以使代码遵循使用准备好的语句的建议。
      【解决方案3】:

      在代码中将变量视为字符串的单引号

      $sql = 'SELECT * FROM data WHERE id_member = $id ORDER BY tgl DESC';

      必须是

      $sql = "SELECT * FROM data WHERE id_member = $id ORDER BY tgl DESC";

      否则您将收到 $id 而不是它的价值;

      【讨论】:

        猜你喜欢
        • 2018-03-09
        • 2015-12-31
        • 2022-01-24
        • 2015-03-03
        • 2019-11-08
        • 1970-01-01
        • 2021-12-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多