我想基於URL參數中的數據(是的,我知道這很容易受到攻擊,但是它的內部代碼爲實用程序)使用PDO運行查詢。迭代PDO查詢的結果
$user = 'USER';
$pass = 'PASSWORD';
$dsn = 'mysql:dbname=PRODUCTS;host=HOST';
try {
$productDB = new PDO($dsn, $user, $pass);
$productDB->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch(PDOException $e) {
$msg = 'PDO ERROR' . $e->getFile() . ' L.' . $e->getLine() . ' : ' . $e->getMessage();
die($msg);
}
if(isset($_GET['cat']))
{
$cat = $_GET['cat'];
print "cat = $cat <br>";
$products = $productDB->prepare('SELECT * FROM products WHERE cat_id LIKE ?');
$products->execute(array($cat));
$rows = $products->rowCount();
print "$rows rows returned";
?>
<table border="1">
<tr>
<td>product_id</td>
<td>product_name</td>
</tr>
<?php
foreach ($products->fetchAll() as $row) {
$id = $row['product_id'];
$product_name = $row['product_name'];
print "<tr>";
print "<th scope=\"row\"><b>$id</b></th>";
print "<td> $product_name </td>";
print "<tr>";
}
print "</table>";
}
?>
當我運行此代碼時,它根據查詢打印正確的行數,但不會填充表。
我也曾嘗試與更換prepare
和execute
線:
$products = $productDB->query("SELECT * FROM products WHERE cat_id LIKE $cat");
它返回正確的行數,但是不以其他方式幫助。
最後,我嘗試過的東西,如替換的foreach行:
$rows = $products->fetchAll();
foreach ($rows as $row) {
我嘗試做相同的固定查詢所有的工作很好,但我有麻煩工作如何放置查詢中的變量元素,然後迭代結果。
如果您在第一個示例中使用佔位符,則不應該容易受到[SQL注入漏洞](http://bobby-tables.com/)的影響。在你的第二個例子中,你在字符串中有'$ cat',你*很脆弱。不要這樣做。由於注入未轉義的數據而發生攻擊。使用佔位符將確保它能夠正確轉義,所以最好儘可能使用它,並且在極少數情況下,如果不能,請特別小心。 – tadman