【问题标题】:How to insert data into MySql using an associative array如何使用关联数组将数据插入 MySql
【发布时间】:2015-01-08 15:44:22
【问题描述】:

我现在在关联数组中插入数据时遇到问题,其键作为表中的字段以及要插入 MySql 数据库的值。这是我的代码。

<?php
$table = 'articles';

$data = array(
        'title' => 'Header',
        'content' => 'This is content',
        'author' => 'James');

$keys = implode(', ', array_keys($data));
$values = implode(', ', array_values($data));

$sql = 'insert into '.$table.'('.$keys.') values ('.$values.')';

$db = new mysqli('localhost', 'root', 'root', 'blog');
$db->query($sql);
?>

使用此代码,我无法将数据插入到数据库中,因此我尝试将查询字符串回显出来,结果如下:

insert into articles(title, content, author) values (Header, This is content, James)

但是,如果我像这样在每个值中使用单引号

insert into articles(title, content, author) values ('Header', 'This is content', 'James')

我可以成功地将数据插入到数据库中。

所以我不知道这里出了什么问题。引号是否有问题,因为当我使用单引号时,这似乎有效。

所以请帮我找到合适的解决方案...

【问题讨论】:

  • 字符串变量周围需要单引号。
  • 在我看来你已经回答了你自己的问题。但是,您需要正确转义您的值(或使用准备好的语句)并确保您的键是有效的列名并且不包含例如需要使用反引号引用的保留字。
  • 你没有检查错误;做。 if(!$result = $db-&gt;query($sql)){ die('There was an error running the query [' . $db-&gt;error . ']'); }
  • 无论如何在 implode() 之后自动将单引号插入到值中。这是我收到的错误您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“内容,James)”附近使用正确的语法
  • Jay 下面的回答对你有用。我知道,我自己测试过。

标签: php mysql


【解决方案1】:

对于查询,您需要将每个值括在引号中。为此,您可以更改 implode 语句以将引号包含在值周围 -

$values = "'" .implode("','", array_values($data)) . "'";

您还应该检查错误。

替换$db-&gt;query($sql);

if(!$result = $db->query($sql)){ 

die('There was an error running the query [' . $db->error . ']'); 

}

else{
echo "Data inserted.";
}

【讨论】:

  • 非常感谢。您刚刚拯救了这一天!
  • ^ 脸上又是一个微笑 ;-)
  • 将原始输入注入 SQL 代码会导致 SQL 注入(最坏情况)和应用程序错误(最好情况)。
  • 我们的目标是取悦! ;-)
  • ^ 没错。现在修好车,以后再照顾鳄鱼。我的5根手指还在吗? Yepper 好的,4 和一个拇指。
【解决方案2】:

所以我不知道这里出了什么问题。引号是否有问题,因为当我使用单引号时,这似乎有效。

是的,您需要使用单引号。

你可以去看看:

$values = implode(', ', array_values($data));

类似的东西:

$values = implode (',', array_map (
function ($z)
{
return ((is_numeric ($z) || (is_string ($z) ? ($z == "NOW()" ? true : false) : false) || (is_array ($z)?(($z=implode(";",$z))?false:false):false)) ? $z : "'" . utf8_decode ($z) . "'");
}, array_values ($data)));

这个想法是你引用每个值字段,我的意思是查询中的值字段逐个值字段。例如,在我的示例中,该函数忽略 NOW() 作为字符串,并保持它作为 SQL 的时间戳工作。因为如果你把它当成字符串类型,这个命令就不能正常工作了。


无论如何,以上内容是丑陋且不安全的。

我建议您寻找一些像 RedBeanORM 这样的 ORM,或者,也许,使用正确的 PHP MySQL 版本,如 MySQLi。主要是为了避免SQL注入。


看一个 ORM 示例:

require 'rb.php';
R::setup();

$post = R::dispense('post');
$post->text = 'Hello World';

$id = R::store($post);       //Create or Update
$post = R::load('post',$id); //Retrieve
R::trash($post);             //Delete

看一个PHP MySQL改进版示例:

$stmt = mysqli_prepare($link, "INSERT INTO CountryLanguage VALUES (?, ?, ?, ?)");
mysqli_stmt_bind_param($stmt, 'sssd', $code, $language, $official, $percent);
$code = 'DEU';
$language = 'Bavarian';
$official = "F";
$percent = 11.2;
mysqli_stmt_execute($stmt);

祝你好运。好好学习。

【讨论】:

    【解决方案3】:

    位置占位符:

    $values = implode(', ', 
        array_fill(0, count($data), '?')
    );
    // insert into articles(title, content, author) values (?, ?, ?)
    

    命名占位符:

    $values = implode(', ', array_map(
        function($value){
            return ":$value";
        },
        array_keys($data)
    ));
    // insert into articles(title, content, author) values (:title, :content, :author)
    

    不一定是最好或最好的代码。

    关于参数数组本身,我对 mysqli 不熟悉,但对于许多 DB 扩展,您可以按原样使用 $data

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      • 2017-06-24
      • 1970-01-01
      • 2017-06-18
      • 2017-08-09
      • 2011-05-29
      • 2015-06-25
      相关资源
      最近更新 更多