如果会员登录,他们的网址就像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的新人。
感谢
答案 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.php与prepare
,http://php.net/manual/en/pdo.prepare.php一起使用。 Prepare
与execute
,http://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而不是它的价值;