将 PHP 数组转换为 SQL 语句?
Posted
技术标签:
【中文标题】将 PHP 数组转换为 SQL 语句?【英文标题】:Convert a PHP array to an SQL statment? 【发布时间】:2014-03-01 06:06:52 【问题描述】:我正在尝试将数组(键/值)转换为 SQL 语句。
我正在使用这样的 mysqli:
if(!$result = $mysqli->query($sql))throw new Exception("SQL Failed ".__file__." on line ".__line__.":\n".$sql);
我有一个这样的数组:
Array
(
[database] => Array
(
[cms_network] => Array
(
[network_id] => 61
[network_name] =>
[network_server_mac_address] => 00:1b:eb:21:38:f4
[network_description] => network
[network_thermostat_reporting_rate] => 5
[network_server_reporting_rate] => 5
[network_data_poll_rate] => 5
[network_created_by] => 38
[network_modified_by] => 1
[network_network_id] => 8012
[network_language] => en
[network_hotel_id] => 68
[network_channel] => 0
[network_deleted] => 0
[network_reported_network_id] => 8012
[network_rooms] => 4
)
)
)
如何将 [cms_network] 转换为如下所示:
$sql = "UPDATE cms_network set network_id='61', network_name='',
network_server_mac_address = '00:1b:eb:21:38:f4', .... WHERE network_id='61'"
我更感兴趣的是如何在我的 select 语句中将数组的 key=>value
对连接为 key='value'
。
感谢您的帮助!
【问题讨论】:
假设您将内联数组设置为变量$cms_network
,您可以使用foreach ($cms_network as $key=>$value)
并构建您的查询字符串。
我想使用 implode() 但我不知道如何将值与键混合。内爆数组时,我只得到以下值:61,,00:1b:eb:21:38:f4,network,5,5,5,38,1,8012,en,68,0,0,8012, 4.我还需要将密钥内爆并以某种方式将它们映射在一起。
implode()
不做关联数组。你可以使用array_walk()
,但这有点矫枉过正。
【参考方案1】:
如果你使用 VALUES 语法,你可以一举搞定。
mysql_query("
UPDATE MyTable
( . implode(',', array_keys($array['database']['cms_network'])) . ")
VALUES ('" . implode("','", $array['database']['cms_network']) . "')
");
当然,这假设数据已经转义。
编辑:更易于阅读和维护的更简洁的版本:
$fields = implode(',', array_keys($array['database']['cms_network']));
$values = implode("','", $array['database']['cms_network']);
mysql_query("UPDATE MyTable ($fields) VALUES ('$values')");
【讨论】:
谢谢,我想简化使用 implode !我的所有数据都已经受到控制,因为它来自另一台服务器上的另一个数据库(它的数据受到保护)。再次感谢!【参考方案2】:我建议您使用格式化的键/值对填充一个数组,然后在最后将它们内爆。这是在每个键/值之间添加所需的,
的简单方法:
$fields = array();
foreach($array['database']['cms_network'] as $key => $value)
// add formatted key/value pair to fields array
// e.g. format: network_id = '26'
$fields[] = $key . " = '" . $value . "'";
$fields = implode(', ', $fields);
// build your query
$query = "UPDATE cms_network SET " . $fields . " WHERE network_id = " . $array['database']['cms_network']['network_id'] . " LIMIT 1";
// process it...
这将(在 SQL 方面)将每个值作为 字符串 插入,这对于整数列等显然是不正确的。无论如何它应该仍然可以工作,但如果不是,你需要放入是否将值括在引号中的条件语句,like this:
foreach(...)
if(is_numeric($value))
$fields[] = $key . ' = ' . $value;
else
$fields[] = $key . " = '$value'";
虽然这可能与您的数据库列类型有关,而不是 php 变量类型。由您决定,它们应该可以很好地处理整数周围的引号。
【讨论】:
值得一提的是,你需要正确地转义字符串值,在这种情况下使用mysql_real_escape_string
,否则你不能保证查询在语法上是正确的【参考方案3】:
这应该可行。
$update_query = "UPDATE `cms_network` SET ";
$count = 0;
foreach($array['database']['cms_network'] as $key => $value)
if ($count != 0)
$update_query = $update_query.",".$key."=".$value;
else
$update_query = $update_query.$key."=".$value;
$count++;
$update_query = $update_query." WHERE ".cms_network."=".$array['database']['cms_network'];
mysql_query($update_query);
【讨论】:
它会生成类似network_server_mac_address=00:1b:eb:21:38:f4
的东西,这不是一个有效的声明
他可以通过内爆、爆炸或任何他想插入此数据的方式自行修复。
它不会 :) 抱歉弄错了另一个函数。以上是关于将 PHP 数组转换为 SQL 语句?的主要内容,如果未能解决你的问题,请参考以下文章