在一个查询中多次插入到不同的表

时间:2014-07-30 20:38:27

标签: php mysql

我正在尝试根据1表单中的信息将记录插入到2个不同的表中。但是我收到语法错误。不确定我做错了什么。

$query = "
    INSERT INTO
        " . DB_PFIX . "pages (
            title,
            url,
            content,
            parent,
            created_by,
            created_date,
            published
        ) VALUES (
            '" . $_POST["title"] . "',
            '" . $_POST["url"] . "',
            '" . $_POST["content"] . "',
            '" . $_POST["parent"] . "',
            '" . $user_id . "',
            '" . $time . "',
            '" . $_POST["published"] . "'
        );
    INSERT INTO
        " . DB_PFIX . "links (
            name,
            function
        ) VALUES (
            '" . $_POST["url"] . "',
            'pages'
        );
";

这是我收到的错误消息:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'INSERT INTO links ( name, function ) VALUES ( '' at line 19

2 个答案:

答案 0 :(得分:3)

问题不在于多个表本身;问题是,默认情况下,PHP mysqli接口在单个语句字符串中禁止多个语句。

使用mysqli,可以启用一个允许此选项的选项。但请注意,此选项会为某些令人讨厌的SQL注入打开一扇大门。默认设置(每个语句字符串只允许一个SQL语句)不会阻止SQL注入;但它确实关闭了一大堆SQL注入的肮脏。)

无需重复此处提供的文档:

http://php.net/manual/en/mysqli.quickstart.multiple-statement.php http://php.net/manual/en/mysqli.quickstart.multiple-statement.php

启用该选项后,可以在单个语句字符串中提交多个SQL语句。

我将再次重复,启用多个语句确实会打开“小鲍比表”式的风格aast

XKCD: Exploits of a Mom

(目前尚不清楚您是使用mysqli还是PDO,但鉴于此语句不包含绑定参数占位符,我冒险说这不是预处理语句,因此您可能正在使用PDO以外的接口。)

答案 1 :(得分:0)

将它们分成两个单独的查询

$query = "
    INSERT INTO
        " . DB_PFIX . "pages (
            title,
            url,
            content,
            parent,
            created_by,
            created_date,
            published
        ) VALUES (
            '" . $_POST["title"] . "',
            '" . $_POST["url"] . "',
            '" . $_POST["content"] . "',
            '" . $_POST["parent"] . "',
            '" . $user_id . "',
            '" . $time . "',
            '" . $_POST["published"] . "'
        );";
mysql_query($query);
$query = "
    INSERT INTO
        " . DB_PFIX . "links (
            name,
            function
        ) VALUES (
            '" . $_POST["url"] . "',
            'pages'
        );
";
mysql_query($query);

但是,您确实应该使用PDO来构建查询,因为您永远不应该相信查询中$ _POST的输入是安全的。这非常难以理解。