PHP中更优雅的方式从数组元素生成查询

时间:2014-03-25 20:01:24

标签: php sql

当我需要在从每个元素生成查询时循环访问某些内容时,我会使用类似

的内容
$queryStr = "INSERT INTO tableName (x,y) VALUES ";
for ($i = 0 ; $i < $len ; $i++)
{
   $queryStr .= "( ".$thing[$i]['x'].", ".$thing[$i]['b']."), ";
}
//extra code to remove the last  comma from string

会有另类选择吗? 我不太介意性能(知道数组的长度不是太大),只是看起来更好的东西。

5 个答案:

答案 0 :(得分:5)

使用准备好的声明:

$sql = 'INSERT INTO tableName (x, y) VALUES (:x, :y)';
$sth = $dbh->prepare($sql);
for ($i = 0 ; $i < $len ; $i++)
{
  $sth->execute(array(
    ':x' => $thing[$i]['x'], 
    ':y' => $thing[$i]['b']));
}

更多示例:http://www.php.net/manual/en/pdo.prepare.php

答案 1 :(得分:2)

略微改进以摆脱最后一部分(删除最新的逗号)。您可以先创建一个值数组,然后使用implode函数,如:

$queryStr = "INSERT INTO tableName (x,y) VALUES ";
for ($i = 0 ; $i < $len ; $i++)
{
  $values[] = "( ".$thing[$i]['x'].", ".$thing[$i]['b'].")";
}
$queryStr .= implode(',', $values);

答案 2 :(得分:1)

我喜欢使用array_walkimplode来做这样的事情:

$values = array(
    array(1, 2, 3),
    array(4, 5, 6),
    . . .
);

// an array to hold the values to insert
$query = array();

// walk the values and build the query array
array_walk($values, function($v) use(&$query) {
    $query[] = "(" . implode(", ", $v) . ")";
});

// dump the output
echo implode(", ", $query);

结果如下:

(1, 2, 3), (4, 5, 6), ...

也许不是更清洁,但至少它摆脱了for循环: - )

答案 3 :(得分:1)

您可以将implode()array_map()

一起使用
implode(', ', array_map(function($v) { return '(' . $v['x'] . ', ' . $v['b'] . ')'; }, $things));

Demo

答案 4 :(得分:0)

    $strCols =  '`'.implode('`, `',array_keys($arrValues)).'`'; //Sets the array keys passed in $arrValues up as column names
    if ($bolEscape){ //Checks if $bolEscape is true
            $arrValues = $this->escape($arrValues); //Calls the escape function
            $strValues = '"'.implode('","',array_values($arrValues)).'"'; //Sets the array values passed in $arrValues up as data for the columns
        }else{
            $strValues = '"'.implode('","',array_values($arrValues)).'"'; //Sets the array values passed in $arrValues up as data for the columns WITHOUT escaping
        }
            //Creates the SQL statement for the query
        $strSQL = 'INSERT INTO `' . $strTable . '` (' . $strCols . ') VALUES (' . $strValues . ')';

这是我编写的数据库类的一部分......我传入了arrValues('ColumnName'=&gt;'Value')