2013-10-09 34 views
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(..) 
} 

回答

2

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

+0

执行2000插入查询会不安全吗?我无法验证,直到所有循环完成。 – Matthew

+0

你的意思是不安全的?安全问题?如果你担心SQL注入或类似的事情,那不是。 – Lorenz

+0

不安全是指我的服务器上的内存使用情况。 – Matthew

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(); 
    } 
} 
1

这没有什么错这种方法,不同的是它使用更多的内存比将通过逐步解析和发布XML数据记录到数据库中使用的事实。如果运行php的服务器属于你,那没问题。如果您使用的是每月共享主机计划的价格为5美元,则可能会遇到内存或执行时间限制。

您提到“安全”。您是否担心如果其中任何一个失败,您将不得不退出所有数据库更新?如果是这种情况,请执行以下两项操作:

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

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

这种交易方式很好,因为如果您的发布过程因任何原因失败,您可以回滚交易并返回到您的起点。

相关问题