2010-03-26 96 views
4

我正在構建一個基本函數,它基於數組中的數量構建Mysql WHERE子句。從FOREACH循環中刪除最後一個詞

$array = array('id' => '3', 'name' => 'roger'); 
$sql = "SELECT * FROM table WHERE "; 

foreach ($array as $k => $v) { 
    $sql .= $k . ' = ' . $v . ' AND '; 
} 

將輸出

SELECT * FROM table WHERE id = 3 AND name = roger AND

但是很明顯,我不希望這樣最後也是,我怎麼去從字符串移除?

感謝

+1

是否$ array總是以阻止SQL注入的方式填充?在輸出中你不需要引用羅傑的話嗎? –

+0

爲了簡化問題,我沒有包含安全措施,顯然在輸入數據庫之前所有數據都會被檢查。 – Stoosh

回答

12

你可以做

$sql = substr($sql, 0, -5); 

但也許是更好的解決方案是

$array = array('id' => '3', 'name' => 'roger'); 
$clauses = array(); 

foreach ($array as $k => $v) 
    $clauses[] = $k . ' = ' . $v; 

$sql = "SELECT * FROM table WHERE " . implode(' AND ', $clauses); 
0

$sql = trim($sql, ' AND ');

+0

'trim()'修剪每個字符A/N/D /空格 - 不是連續的完整字符串。 –

+0

真的,很好。 – jps

2
$array = array('id' => '3', 'name' => 'roger'); 
$sql = "SELECT * FROM table WHERE "; 

foreach ($array as $k => $v) { 
    $sql .= $k . ' = ' . $v . ' AND '; 
} 

$sql = substr(trim($sql), 0, -3); 
0

重新制定問題。你試圖在除了最後一個之外的每個子句之後加上一個AND。在第一個條款之前的每個條款之前放置一個AND會更容易。


$first = true; 
foreach ($array as $k => v) { 
    if (!$first) $sql .= ' AND '; 
    $first = false; 
    sql .= $k . ' = ' . $v; 
} 

也許不是這種情況下最簡單的方法(其他人提到使用substr)。不過,我發現它是一個很好的記憶工具,可以用於這種情況。

1

我會做這種方式:

$sql = "SELECT * FROM table WHERE 1=1 "; 
// add "AND x=y" for every pair of key, value pair in the array.  
foreach ($array as $k => $v) 
    $sql .= ' AND ' . $k . ' = ' . $v; 

我添加了一個1=1where子句,以便您的查詢將是有效即使數組$array爲空

相關問題