2015-05-29 112 views
0

如果會員登錄他們的網址類似的index.php?ID = 5從數據庫的foreach特定ID PDO顯示數據

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

,但我不明白。 有人可以幫我嗎?請給我正確的代碼並解釋它,IAM新的與PDO。

感謝

回答

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變量。

+0

哇,這個「單引號字符串不會被PHP評價」,我現在會仔細地談論引用,我忘記了。非常感謝 – user3666416

+0

沒問題,樂意幫忙。 – Pavlin

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,而不是它的價值;

2

您不使用query函數,http://php.net/manual/en/pdo.query.php,與prepare,http://php.net/manual/en/pdo.prepare.phpPrepare結合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>';  
}