Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP中从数组元素生成查询的更优雅的方法_Php_Sql - Fatal编程技术网

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

PHP中从数组元素生成查询的更优雅的方法,php,sql,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 $queryStr=“插入到t

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

$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
$queryStr=“插入到tableName(x,y)值中”;
对于($i=0;$i<$len;$i++)
{
$queryStr.=“(“$thing[$i]['x']”,“$thing[$i]['b']”,”;
}
//从字符串中删除最后一个逗号的额外代码
还有别的选择吗?
我不介意性能太高(知道数组的长度不是太大),只是一些看起来更好的东西。

为了去掉最后一部分(删除最新的逗号),稍微改进一下。您可以先创建一个值数组,然后使用内爆函数,如:

$queryStr = "INSERT INTO tableName (x,y) VALUES ";
for ($i = 0 ; $i < $len ; $i++)
{
  $values[] = "( ".$thing[$i]['x'].", ".$thing[$i]['b'].")";
}
$queryStr .= implode(',', $values);
$queryStr=“插入到tableName(x,y)值中”;
对于($i=0;$i<$len;$i++)
{
$values[]=“(“$thing[$i]['x']”,“$thing[$i]['b']”);
}
$queryStr.=内爆(“,”,$values);

使用准备好的语句:

$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']));
}
$sql='INSERT-INTO-tableName(x,y)值(:x,:y)';
$sth=$dbh->prepare($sql);
对于($i=0;$i<$len;$i++)
{
$sth->execute(数组)(
“:x'=>$thing[$i]['x'],
“:y'=>$thing[$i]['b']);
}

更多示例:

我喜欢使用
array\u walk
内爆
来实现以下功能:

$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), ...
结果如下所示:

$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
循环:-)

您可以将
内爆()
数组映射()
一起使用:


这是我写的数据库类的一部分。。。我传入arrValues('ColumnName'=>'Value')

如果它对您有效,那么应该没问题。虽然我认为这种逻辑会为最后一对添加一个额外的逗号,这可能会导致查询错误。我认为最好使用string创建一个数组。我认为您也会喜欢创建块,我不知道在mysql中,但是sql server对insert语句的限制是1000您知道mysql在insert语句中是否像sql server一样有限制(1000是sql server中的限制)?1000是Oracle和sql server中在
in子句中添加值的限制。我认为这不适用于这里,因为它只是执行一个只有两个参数的语句并分别执行它们。谢谢,我不知道其他引擎,在sql server中,您有
插入到[表]([field1],[field2])值(values1),…(Values1000)
您将得到一个关于值1001的错误不,您是对的,MySQL可能也有这样的限制。只是我的解决方案不同,因为我为每一行执行语句。但请注意,这可能会对性能产生负面影响,特别是在插入多行时。这是一个很好的单行解决方案。我喜欢在这里使用数组映射-我不熟悉这个函数。