将数组更改为SQL查询PHP

时间:2014-04-24 15:43:57

标签: php sql arrays

我有一个如下所示的数组$contact

Array
(
    [0] => Array
        (
            [type] => Textbox
            [label] => Company
            [name] => company
            [properties] => a:2:{s:11:"class_label";s:8:"col-md-4";s:5:"class";s:8:"col-md-8";}
            [language] => EN
            [weight] => 1
            [nid] => 5
        )

    [1] => Array
        (
            [type] => Textbox
            [label] => First name
            [name] => first_name
            [properties] => a:3:{s:8:"required";b:1;s:11:"class_label";s:8:"col-md-4";s:5:"class";s:8:"col-md-8";}
            [language] => EN
            [weight] => 2
            [nid] => 5
        )

    [2] => Array
        (
            [type] => Textbox
            [label] => Last Name
            [name] => last_name
            [properties] => a:3:{s:8:"required";b:1;s:11:"class_label";s:8:"col-md-4";s:5:"class";s:8:"col-md-8";}
            [language] => EN
            [weight] => 3
            [nid] => 5
        )

我想将其更改为:

INSERT INTO `form` (`nid`, `language`, `label`, `name`, `type`, `properties`, `options`, `weight`) VALUES
( 5, 'EN', 'Société', 'societe', 'Textbox', 'a:2:{s:11:"class_label";s:8:"col-md-4";s:5:"class";s:8:"col-md-8";}', NULL, 1),
( 5, 'EN', 'First name', 'first_name', 'Textbox', 'a:3:{s:8:"required";b:1;s:11:"class_label";s:8:"col-md-4";s:5:"class";s:8:"col-md-8";}', NULL, 2),
( 5, 'EN', 'Last Name', 'last_name', 'Textbox', 'a:3:{s:8:"required";b:1;s:11:"class_label";s:8:"col-md-4";s:5:"class";s:8:"col-md-8";}', NULL, 3);

所以我尝试了这个:

function insert_contact($array){
    foreach($array as $key => $value){       
        if ($key == 'fields'){
            $columns = array_keys($value);
            $values = array_values($value);
        }
    }
    $sql = "INSERT INTO `".'form' . "` (`".implode("`, `", $columns)."`)";
    $sql .= " VALUES ('".implode("', '", $values)."') ;";
    return $sql;

}

它只适用于数组的第一个元素,但是当我这样做时:

    foreach ($var as $key => $value) {
        var_dump(insert_contact( $var[$key]));
     }

它显示我的错误:Notice: Undefined variable: columns
有没有办法避免此错误并生成一个干净的SQL查询?感谢

2 个答案:

答案 0 :(得分:2)

您的阵列中没有fields。代码用于第一个元素的原因是:

if ($key == 'fields'){
如果$ key为0(由于类型强制),

将为真。

尝试:

function insert_contact($array){
    $values = array();
    foreach($array as $key => $value){       
        $columns = array_keys($value);
        $values[] = "('" . implode("', '", array_values($value))."')";
    }
    $sql = "INSERT INTO `".'form' . "` (`".implode("`, `", $columns)."`)";
    $sql .= " VALUES ".implode(',', $values) .";";
    return $sql;

}

请注意,如果$array或其内容可能来自用户输入,则您不希望在没有首先转义它们的情况下使用查询中的值。

答案 1 :(得分:0)

Jim写了一个很好的答案,但他从未解释过实际的错误:

在函数的第8行,您调用变量$columns。但是,由于$key == 'fields'的计算结果为false,因此永远不会设置。这就是为什么错误说明有一个未定义的变量名为' columns'在剧本中。

您只能调用之前已定义的变量。