从数组 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 =&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();

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

【讨论】:

他从未说过输入来自用户。尽管如此,我会纠正它。 输入是否来自用户并不重要。其中一个字段可以使用保留字符。无论来源如何,您都应该始终转义数据。 取点并修复后。 @布拉德

以上是关于从数组 MySQL 和 PHP 构建插入查询的主要内容,如果未能解决你的问题,请参考以下文章

使用“mysql_fetch_row”从数据库中检索结果并使用 PHP 和 mysqli 插入数组?

JSON / PHP数组到MYSQL插入[关闭]

从mysql查询php创建数组

从数据数组(php,mysql)编写循环sql查询

PHP 从MySQL查询返回数组

PHP 数组作为单独的行插入 MySQL 表