一尘不染

如何使用关联数组编写良好的PHP数据库插入

sql

在PHP中,我想使用字段/值对的关联数组中包含的数据插入数据库。

例子:

$_fields = array('field1'=>'value1','field2'=>'value2','field3'=>'value3');

生成的SQL插入应如下所示:

INSERT INTO table (field1,field2,field3) VALUES ('value1','value2','value3');

我想出了以下PHP一线代码:

mysql_query("INSERT INTO table (".implode(',',array_keys($_fields)).") VALUES (".implode(',',array_values($_fields)).")");

它将关联数组的键和值分开,并implodes生成一个逗号分隔的string。问题在于它不会转义或引用插入数据库的值。为了说明这种危险,请想象一下其中是否$_fields包含以下内容:

$_fields = array('field1'=>"naustyvalue); drop table members; --");

将生成以下SQL:

INSERT INTO table (field1) VALUES (naustyvalue); drop table members; --;

幸运的是,不支持多个查询,但是引号和转义对防止SQL注入漏洞至关重要。

您如何编写PHP Mysql插入?

注意:PDO或mysqli准备好的查询目前不是我的选择,因为代码库已经广泛使用mysql-计划中进行更改,但是转换需要大量资源吗?


阅读 144

收藏
2021-03-17

共1个答案

一尘不染

我唯一要更改的是将sprintf用于可读性目的

$sql = sprintf(
    'INSERT INTO table (%s) VALUES ("%s")',
    implode(',',array_keys($_fields)),
    implode('","',array_values($_fields))
);
mysql_query($sql);

并确保这些值均已转义。

2021-03-17