从数组MySQL和PHP构建插入查询
我正在用PHP编写一个小的web服务,在理解以下场景时遇到了一些问题 我的计划是能够向函数发送一个数据数组,然后函数将为MySQL构建一个要运行的查询。在数组中,我计划键作为列名,值作为进入列的值。。i、 e从数组MySQL和PHP构建插入查询,php,mysql,arrays,key-value,Php,Mysql,Arrays,Key Value,我正在用PHP编写一个小的web服务,在理解以下场景时遇到了一些问题 我的计划是能够向函数发送一个数据数组,然后函数将为MySQL构建一个要运行的查询。在数组中,我计划键作为列名,值作为进入列的值。。i、 e $myData = array('userName'=>'foo','passWord'=>'bar'); $myClass = new users(); $myClass->addUser($myData); 然后,在我的功能中,我目前有: function add
$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."'";
}
}
但我认为可能有一个更优雅的解决方案
这可能是一件非常简单的事情,但我以前从未遇到过这一点,因此我将感谢任何帮助和指导
谢谢
戴夫这件怎么样
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();
}
它应该为您完成这项工作。仅供参考,您的代码目前对SQL注入非常开放 使用。您可以定义参数名称,只需传递关联数组即可进行插入 您将无法在其中粘贴任意数组,因为您需要适当地命名参数(例如
:userName
而不是userName
),但我认为您无论如何都不想这样做。尝试以下操作:
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;";
}
以下是我倾向于用于插入查询的代码:
<?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)
?>
编辑:哎呀!忘记在值()周围加引号,删除旧代码
$query = "INSERT INTO `mytable` ( ".
mysql_real_escape_string(implode(' , ',array_keys( $userData))).
") VALUES ( '".
mysql_real_escape_string(implode("' , '", $userData)).
"' )";
我的大工程(简单)方法做这件事。
它需要一些重构,
但这对我来说是可以理解的
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;
}
优雅的解决方案:
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);
}
他从未说过输入来自用户。尽管如此,我还是会纠正它。输入是否来自用户并不重要。其中一个字段可以使用保留字符。您应该始终转义数据,而不考虑数据的来源。获取的点和修复后的点@BradI只是直接在编辑器中编写了这篇文章,它并不完全反映我在家里开发机器上的代码。我确实把所有东西都消毒了;)现在这还不是一个真正的答案,是吗?@Rikudo-出于好奇,使用mysql_*函数有什么问题吗?它们(非官方地)被弃用了,有更好的替代方案,比如MySQLi(好)和PDO(棒极了)。当你说“非官方地”弃用时,你的意思是说它们将在不久的将来被弃用吗,或者这不是真正的最佳实践,还有更好的选择我只是想弄明白原因:)谢谢马特。我把它和我自己的卫生功能一起使用,效果很好。不幸的是,PDO不是我的选择。你不能直接在
内爆()上使用数组键($array)
?当您可以使用array\u key($array)
和array\u value($array)
获取相应的键和值时,为什么要使用foreach$key=>$value
?请纠正我,如果我遗漏了一点/做了错事啊,我写这篇文章时完全忘记了array_键/array_值-我的错。我会尽快更新的。
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);
}