从数组运行我的查询是否安全


Is it safe to run my queries from an array?

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

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

你可以做的是对支持它的库(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();
    }
}

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

你提到了"安全"。您是否担心如果其中任何一个数据库更新失败,则必须回退所有数据库更新?如果是这种情况,请执行两项操作:

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

  • 使用事务,并在发布所有数据库更改后提交它。

这种事务处理方法很好,因为如果发布过程因任何原因失败,则可以回滚事务并返回到起点。