将 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 语句?的主要内容,如果未能解决你的问题,请参考以下文章

如何将带有内连接语句的 Sql 查询转换为带有 Where 语句的 sql 查询(语句中没有内连接)

将 SQL CASE WHEN 语句转换为 C#

如何将此sql语句转换为laravel orm?

将 SQL 语句转换为 LINQ VS2010

如何将以下 SQL 语句转换为 LINQ 方法语法

将 Access 删除语句转换为 SQL Server