从FOREACH循环中删除最后一个单词

4
我正在构建一个基本函数,它会根据数组中的数量构建Mysql WHERE子句。
$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

然而,很明显,我不希望最后的AND存在,我该如何从字符串中删除它?

谢谢


1
$array 的填充方式是否总是可以防止 SQL 注入?在输出中,roger 周围不需要加引号吗? - user287466
为了让问题简洁明了,我没有包括安全措施,显然所有数据在输入到数据库之前都将被检查。 - Stoosh
5个回答

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);

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);

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;

我已经在where子句中添加了1=1,这样即使数组$array为空,你的查询也会是有效的

0
重新表述问题。您试图在除最后一个子句外的每个子句后面加上AND。在除第一个子句外的每个子句前面加上AND会更容易些。

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

也许在这种情况下不是最简单的方法(其他人提到使用substr)。不过,我发现这是一种在类似这种情况下很好记住的工具。

0

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


trim()修剪每个字符A/N/D/空格--而不是整个字符串一行。 - Amy B

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接