PDO显示来自数据库的数据foreach特定ID

时间:2015-05-29 19:44:05

标签: php pdo

如果会员登录,他们的网址就像index.php?id = 5

$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();
$sql = 'SELECT * FROM data WHERE id_member = $id 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的新人。

感谢

3 个答案:

答案 0 :(得分:2)

在你的第二个声明中,你在sql字符串周围使用单引号。单引号字符串不会被PHP评估,您必须使用双引号才能评估表达式。所以这样做可以解决你的第二个问题:

$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>';    
}

在您的第三个声明中,您正在使用准备好的查询,因此您的查询应该看起来不同:

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

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

$q->execute();

通常更好的做法是使用预准备语句,因为它们可以防止SQL注入攻击。如果您不想使用它们,请确保适当地过滤和清理$ _GET变量。

答案 1 :(得分:2)

您不会将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 :(得分:0)

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

$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而不是它的价值;