我有一个相当大的插入语句,例如
INSERT INTO multimedia (filename, regex, flag) VALUES (('adsfavr.jpg', '<div id="title">', 0), (...), (...));
如何为 MySQL 准备查询。手动执行太长了。它包含双引号,所以我不能使用 php 函数 mysql_real_escape_string()
我有一个相当大的插入语句,例如
INSERT INTO multimedia (filename, regex, flag) VALUES (('adsfavr.jpg', '<div id="title">', 0), (...), (...));
如何为 MySQL 准备查询。手动执行太长了。它包含双引号,所以我不能使用 php 函数 mysql_real_escape_string()
为什么要用一条语句插入所有记录?您可以使用准备好的语句: INSERT INTO media (filename, regex, flag) VALUES (?, ?, ?);
和一个 for 循环来一一插入记录。
我不是 PHP 程序员,但代码可能看起来像这样(部分来自http://php.net/manual/en/pdo.prepared-statements.php):
$stmt = $dbh->prepare("INSERT INTO multimedia (filename, regex, flag) VALUES (:filename, :regex, :flag)");
$stmt->bindParam(':filename', $filename);
$stmt->bindParam(':regex', $regex);
$stmt->bindParam(':flag', $flag);
for ( $i = 1; $i <= ...; $i++) {
$filename = ...
$regex = ...
$flag = ...
$stmt->execute();
}
使用准备好的语句,DBMS 只编译 SQL 一次,就像使用 SQL 语句一样。要确保插入所有记录或不插入任何记录(如果您仍然需要这样的断言),请使用事务。
此外,这也将解决您的转义问题,因为您不需要将值放在字符串中。准备好的语句的字符串仅定义 SQL“模板”。
如果您的数据存储在逗号分隔的文件中,您可以使用LOAD DATA INFILE
查询
这些数据的样本可能会有所帮助。
您可以尝试这种方式在单个查询中执行多个插入...
$sql = "插入用户(姓名、年龄) 价值观 (“海伦”,24), ('卡特里娜',21), (‘萨米亚’,22)”; mysql_query($sql);