如何使用关联数组将数据插入MySql

时间:2015-01-08 15:44:23

标签: php mysql

我现在在关联数组中插入数据时遇到问题,其中键作为表中的字段以及要插入到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')

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

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

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

3 个答案:

答案 0 :(得分:7)

对于查询,您需要将每个值括在引号中。要做到这一点,您可以更改您的内爆语句,以包括值周围的引号 -

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

您还应该检查错误。

替换$db->query($sql);

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

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

}

else{
echo "Data inserted.";
}

答案 1 :(得分:1)

  

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

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

您可以查看:

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

祝你好运。好学习。

答案 2 :(得分:1)

位置占位符:

$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但是有很多数据库扩展,你可以按原样使用$data