0

我正在运行一个循环来从 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(..) 
}
4

3 回答 3

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();
    }
}
于 2013-10-09T20:02:43.720 回答
2

要将大量日期插入 MySQL 数据库,我将启动一个事务(http://php.net/manual/en/mysqli.begin-transaction.php),然后创建一个准备好的语句并遍历所有项目并立即验证它们并执行准备好的语句。之后只需将交易标记为成功并结束它。这是最快的方法。使用准备好的语句还可以防止 SQL 注入。

于 2013-10-09T20:01:14.957 回答
1

这种方法没有任何问题,除了它使用的 RAM 比逐步解析 XML 数据记录并将其发布到数据库所使用的 RAM 更多。如果运行 php 的服务器属于你,那没问题。如果您使用的是每月 5 美元的廉价共享托管计划之一,您可能会遇到内存或执行时间限制。

你提到了“安全”。您是否担心如果其中任何一个数据库更新失败,您将不得不退出所有数据库更新?如果是这种情况,请做两件事:

  • 不要对您的表使用 MyISAM 访问方法。

  • 使用事务,当您发布所有数据库更改时,提交它。

这种事务性方法很好,因为如果您的过帐过程因任何原因失败,您可以回滚事务并回到您的起点。

于 2013-10-09T20:06:07.630 回答