【问题标题】:Build insert query from array MySQL and PHP从数组 MySQL 和 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."'";
   }
}

但我认为可能有更优雅的解决方案。

这可能是一件非常简单的事情,但我以前从未遇到过,所以我将不胜感激任何帮助和指导..

谢谢,

戴夫

【问题讨论】:

    标签: php mysql arrays key-value


    【解决方案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 =&gt; $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();
              }
              

              它应该为你完成这项工作。

              【讨论】:

              • 他从未说过输入来自用户。尽管如此,我会纠正它。
              • 输入是否来自用户并不重要。其中一个字段可以使用保留字符。无论来源如何,您都应该始终转义数据。
              • 取点并修复后。 @布拉德
              猜你喜欢
              • 2018-01-03
              • 1970-01-01
              • 2010-11-06
              • 2016-07-20
              • 2015-09-07
              • 2011-03-25
              • 2012-07-16
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多