从数组 MySQL 和 PHP 构建插入查询
Posted
技术标签:
【中文标题】从数组 MySQL 和 PHP 构建插入查询【英文标题】:Build insert query from array MySQL and PHP 【发布时间】:2011-10-26 11:16:07 【问题描述】:我正在用 php 编写一个小型 Web 服务,但在理解以下场景时遇到了一些麻烦。
我的计划是能够将一组数据发送到一个函数,然后该函数将构建一个查询以供 mysql 运行。在数组中,我计划将键作为列名,将值作为进入列的值..即
$myData = array('userName'=>'foo','passWord'=>'bar');
$myClass = new users();
$myClass->addUser($myData);
然后,在我目前的功能中:
function addUser($usrData)
foreach($usrData as $col => $val)
// This is where I'm stuck..
基本上,我想知道如何将键和值分开,以便我的查询变为:
INSERT INTO `myTable` (`userName`,`passWord`) VALUES ('foo','bar');
我知道我可能会做类似的事情:
function addUser($usrData)
foreach($usrData as $col => $val)
$cols .= "," . $col;
$values .= ",'".$val."'";
但我认为可能有更优雅的解决方案。
这可能是一件非常简单的事情,但我以前从未遇到过,所以我将不胜感激任何帮助和指导..
谢谢,
戴夫
【问题讨论】:
【参考方案1】:如何使用 mysqli 插入查询以数组格式插入批量记录。
$i = 1;
$fields = '';
foreach($usrData as $col => $val)
if($i < count($usrData))
$col = $this->conn->real_escape_string($col);
$val = $this->conn->real_escape_string($val);
$fields .= "`$col` = '".$val."'";
$fields .= ', ';
$i++;
else
$col = $this->conn->real_escape_string($col);
$val = $this->conn->real_escape_string($val);
$fields .= "`$col` = '".$val."'";
$sqls = "INSERT INTO table_name SET $fields;";
$result = mysqli_query($this->conn, $sqls);
if($result)
return $this->conn->insert_id;
else
return false;
【讨论】:
【参考方案2】:编辑: 哎呀!忘记在 VALUES( ) 周围引用,删除旧代码
$query = "INSERT INTO `mytable` ( ".
mysql_real_escape_string(implode(' , ',array_keys( $userData))).
") VALUES ( '".
mysql_real_escape_string(implode("' , '", $userData)).
"' )";
【讨论】:
【参考方案3】:优雅的解决方案:
function create_insert_query($tablename, $array)
$key = array_keys($array);
$val = array_values($array);
//sanitation needed!
$query = "INSERT INTO $tablename (" . implode(', ', $key) . ") "
. "VALUES ('" . implode("', '", $val) . "')";
return($query);
【讨论】:
【参考方案4】:我的 Bigginer(简单)方法。 它需要一些重构, 但这对我来说是可以理解的。
public function insertArr( $table, $paramsArr)
$sql = "INSERT INTO $table (";
foreach ( $paramsArr as $name=>$value )
$sql .="`$name`,";
$sql = substr($sql, 0, strlen($sql)-1);
$sql .= ") VALUES (";
foreach ($paramsArr as $name => $value)
$value === null? $sql .= "null," : $sql .= "'$value',";
$sql = substr($sql, 0, strlen($sql)-1);
$sql .= ");";
$this->link->query($sql);
return $this->link->affected_rows;
【讨论】:
【参考方案5】://This Will Help You To Insert Data Into Database by Array
$myData = array('user'=>'foo','name'=>'bar','player'=>'Sachin');
$get->adddd('tabelname',$myData);
function insert($tabel,$usrData)
$count = 0;
$fields = '';
foreach($usrData as $col => $val)
if ($count++ != 0) $fields .= ', ';
if($count==1)
$field .= $col;
$value .= "'".$val."'";
else
$field .= ','.$col;
$value .= ",'".$val."'";
$fields .= "`$col` = $val";
mysql_query($query = "INSERT INTO $tabel ($field) VALUES ($value)");
【讨论】:
【参考方案6】:这是我倾向于用于插入查询的代码:
<?php
// Extend the PDO class, adding support for array to query binding
class db extends pdo
// This makes the SQL insert query
function insert($keyValue)
if(is_array($keyValue))
foreach($keyValue as $key => $value)
$fields[] = '`'.$key.'`';
$values[] = ':'.$key;
return '('.implode(' , ',$fields).') VALUES '.'('.implode(' , ',$values).')';
return '';
// Change the key to be :key to stop injections
function bind($keyValue)
if(is_array($keyValue))
foreach($keyValue as $key => $value)
if(is_array($value)) // if the value is array, lets assume I want an OR statement.
$count = -1;
foreach($value as $sValue)
$count++;
$where[':'.$key.$count] = $sValue;
else
$where[':'.$key] = $value;
return $where;
return array();
// It can be used like
try
// Call the PDO class (Connect to the database).
$db= new PDO('mysql:host='.$host.';dbname='.$dbname, $user, $pass);
catch(PDOException $e)
// If something goes wrong, PDO throws an exception with a nice error message.
echo $e->getMessage();
// The values you want to Add
$values = array('username' => $username, 'otherdata' => $otherdata);
$db->prepare('INSERT INTO `users` '.$db->insert($values).';') // The SQL statement.
->execute($db->bind($values)); // Bind the values to the query (Stopping SQL injections)
?>
【讨论】:
你不能在implode()
上直接使用array_keys($array)
吗?为什么foreach $key => $value
可以使用array_keys($array)
和array_values($array)
获得各自的键和值?如果我遗漏了一点/做错了什么,请纠正我
啊,我在写这篇文章的时候完全忘记了array_keys/array_values——我的错。我会尽快更新。【参考方案7】:
试试这个:
function addUser($usrData)
$count = 0;
$fields = '';
foreach($usrData as $col => $val)
if ($count++ != 0) $fields .= ', ';
$col = mysql_real_escape_string($col);
$val = mysql_real_escape_string($val);
$fields .= "`$col` = $val";
$query = "INSERT INTO `myTable` SET $fields;";
【讨论】:
@Rikudo - 出于好奇,使用 mysql_* 函数有什么问题? 它们(非官方)已弃用,存在更好的替代品,例如 MySQLi(好)和 PDO(真棒)。 当您说“非官方”弃用时,您的意思是它们将在不久的将来被弃用,或者这不是真正的最佳实践并且有更好的替代方案? - 只是想了解其中的原因:) 谢谢马特。我已经将它与我自己的卫生功能一起使用,并且效果很好。不幸的是,PDO 不是我的选择。【参考方案8】:仅供参考,您的代码目前对 SQL 注入开放。
使用prepared queries with PDO。您可以定义参数名称,然后传递一个关联数组来进行插入。
您将无法在其中粘贴任意数组,因为您需要适当地命名参数(例如 :userName
而不是 userName
),但我认为您不想这样做无论如何。
【讨论】:
我只是把它直接写到编辑器中,它并不能完全反映我在家里的开发机器上的代码。我确实对所有东西都进行了消毒;) 现在这不是一个真正的答案是吗?【参考方案9】:这个怎么样?
function addUser($usrData)
$query = "INSERT INTO `myTable` (`userName`, `passWord`) VALUES (:userName, :passWord);";
$stmt = $pdo->prepare($query);
foreach($usrData as $col => $val)
$stmt->bindValue(':'.$col, $val);
$stmt->execute();
它应该为你完成这项工作。
【讨论】:
他从未说过输入来自用户。尽管如此,我会纠正它。 输入是否来自用户并不重要。其中一个字段可以使用保留字符。无论来源如何,您都应该始终转义数据。 取点并修复后。 @布拉德以上是关于从数组 MySQL 和 PHP 构建插入查询的主要内容,如果未能解决你的问题,请参考以下文章