从数组MySQL和PHP构建插入查询

从数组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

我正在用PHP编写一个小的web服务,在理解以下场景时遇到了一些问题

我的计划是能够向函数发送一个数据数组,然后函数将为MySQL构建一个要运行的查询。在数组中,我计划键作为列名,值作为进入列的值。。i、 e

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