如何使用关联数组将数据插入 MySql
How to insert data into MySql using an associative array
我现在在关联数组中插入数据时遇到问题,其键作为 table 中的字段,而值要插入到 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')
我可以成功将数据插入数据库。
所以我不知道这里出了什么问题。是不是引号有问题,因为当我使用单引号时,这似乎有效。
所以请帮我找到合适的解决方案...
对于查询,您需要将每个值括在引号中。为此,您可以更改内爆语句以将引号包含在值周围 -
$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.";
}
So I don't know what's wrong here. Is it a problem with the quote sign or not because when I use the single quote, this seems to work.
是的,您需要使用单引号。
你可以看看:
$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 or, maybe, use the proper PHP MySQL version like MySQLi 这样的 ORM。主要是为了避免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
看一个PHPMySQL改进版例子:
$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);
祝你好运。好好学习。
位置占位符:
$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
。
我现在在关联数组中插入数据时遇到问题,其键作为 table 中的字段,而值要插入到 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')
我可以成功将数据插入数据库。
所以我不知道这里出了什么问题。是不是引号有问题,因为当我使用单引号时,这似乎有效。
所以请帮我找到合适的解决方案...
对于查询,您需要将每个值括在引号中。为此,您可以更改内爆语句以将引号包含在值周围 -
$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.";
}
So I don't know what's wrong here. Is it a problem with the quote sign or not because when I use the single quote, this seems to work.
是的,您需要使用单引号。
你可以看看:
$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 or, maybe, use the proper PHP MySQL version like MySQLi 这样的 ORM。主要是为了避免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
看一个PHPMySQL改进版例子:
$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);
祝你好运。好好学习。
位置占位符:
$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
。