我正在运行循环来从XML文件中收集数据,在完成2000多行之后,会有一些验证规则在之后运行。如果它是安全的我想存储MySQL数据,在前面提到的循环中我想将所有MySQL查询存储到一个数组(几乎是2000个查询)并在验证规则完成后在循环中运行它们。
这是个坏主意吗?如果是这样,那么存储查询并在以后运行它的最佳想法是什么?
如果您不理解,请告诉您我正在谈论的内容:
foreach($xml->object as $control) {
// Stores relative xml data here
}
if(1=1) // Validation rules run
for(...) { // For Loop for my queries (2000 odd loop)
Mysql_Query(..)
}
答案 0 :(得分:2)
要在MySQL数据库中插入大量日期,我将启动一个事务(http://php.net/manual/en/mysqli.begin-transaction.php),然后创建一个预准备语句并循环遍历所有项目并立即验证它们并执行准备好的语句。之后只需将交易标记为成功并结束即可。这是最快的方法。 使用预准备语句也会阻止SQL注入。
答案 1 :(得分:2)
您可以做的是为支持它的库(PDO或mysqli)使用预准备语句。在PDO中:
$stmt = $pdo->prepare("INSERT INTO t1 VALUES (:f1, :f2, :f3)");
$stmt->bindParam(":f1", $f1);
$stmt->bindParam(":f2", $f2);
$stmt->bindParam(":f3", $f3);
foreach ($xml->obj as $control) {
// create $array
}
if ($valid) {
foreach ($array as $control) {
$f1 = $control['f1'];
$f2 = $control['f2'];
$f3 = $control['f3'];
$stmt->execute();
}
}
答案 2 :(得分:1)
这种方法没有任何问题,除了它使用的RAM多于逐步解析和将XML数据记录发布到数据库所使用的RAM。如果运行php的服务器属于你那没问题。如果您正在使用每月便宜的USD5共享托管计划之一,那么您可能会遇到内存或执行时间限制。
你提到“安全”。您是否担心如果其中任何一个更新失败,您将不得不退出所有数据库更新?如果是这种情况,请做两件事:
请勿对您的表使用MyISAM访问方法。
使用交易,当您发布所有数据库更改时,请提交。
这种交易方法很好,因为如果您的发布过程因任何原因失败,您可以回滚交易并返回到起点。