PHP:一个mysql_query语句中的多个SQL查询

时间:2008-12-06 00:41:21

标签: php sql mysql

所以我有一个需要使用mysql_query()加载的SQL转储文件。不幸的是,用它执行多个查询是不可能的。

- >不能假设安装了 mysql命令行客户端(mysql --help) - 直接加载SQL文件

- >不能假设 mysqli 扩展已安装

/* contents of dump.sql, including comments */
DELETE FROM t3 WHERE body = 'some text; with semicolons; scattered; throughout';
DELETE FROM t2 WHERE name = 'hello';
DELETE FROM t1 WHERE id = 1;

下面的explode()不起作用,因为某些转储内容的值包含分号。

$sql = explode(';', file_get_contents('dump.sql'));
foreach ($sql as $key => $val) {
    mysql_query($val);
}

在不修改转储文件的情况下加载SQL的最佳方法是什么?

4 个答案:

答案 0 :(得分:12)

您遇到的问题不仅仅是字符串中的分号。

  • mysql_query()无法执行的脚本builtin命令,如USE
  • 未以分号结尾的语句,例如DELIMITER
  • 包含分号但不在引号内的语句,如CREATE PROCEDURE

我不知道有一种简单的方法来处理这个任务,而不会炮轰到mysql命令行客户端。我意识到你说你不能依赖那个客户端,但没有那个客户端,你需要大量的PHP代码来解析脚本并适当地执行语句。

您可以在phpMyAdmin产品中找到此类代码。但是,该产品是根据GPL许可的,因此如果您使用任何代码,您还必须根据GPL许可您自己的项目。


另见我对这些相关问题的回答:

答案 1 :(得分:5)

奥卡姆的剃刀再次罢工。

上面的explode()函数不起作用,因为值中有分号。但是,我没有意识到(并提及)分号总是在SQL转储文件中的换行符之前。可惜的是,

$sql = explode(";\n", file_get_contents('dump.sql'));
foreach ($sql as $key => $val) {
    mysql_query($val);
}

另外,感谢你的帮助,比尔。

答案 2 :(得分:3)

这里有一个更大的问题。您可能有依赖于其他语句的语句。你不能盲目地盲目地执行它们。

答案 3 :(得分:0)

<?php
//STATIC QUERY
$sql1 = "
CREATE TABLE tblTable (
strOne VARCHAR(50) NOT NULL,
strTwo VARCHAR(50) NOT NULL,
strThree VARCHAR(50) NOT NULL
);
INSERT INTO tblTable
(strOne, strTwo, strThree)
VALUES ('String 1', 'String 2', 'String 3');
UPDATE tblTable
SET
strOne = 'String One',
strTwo = 'String Two'
WHERE strThree = 'String 3';
"; 
//GET FROM FILE
$sql2 = file_get_contents('dump.sql');
$queries = preg_split("/;+(?=([^'|^\\\']*['|\\\'][^'|^\\\']*['|\\\'])*[^'|^\\\']*[^'|^\\\']$)/", $sql);
foreach ($queries as $query){
   if (strlen(trim($query)) > 0) mysql_query($query);
}
?>