猿问

PDO准备在单个查询中插入多行

PDO准备在单个查询中插入多行

我目前正在MySQL上使用这种类型的SQL在一个查询中插入多行值:

INSERT INTO `tbl` (`key1`,`key2`) VALUES ('r1v1','r1v2'),('r2v1','r2v2'),...

在PDO的阅读中,使用准备好的语句应该比静态查询提供更好的安全性。

因此,我想知道是否可以使用预先准备的语句生成“使用一个查询插入多行值”。

如果是,我可以知道如何实施吗?


慕尼黑5688855
浏览 523回答 3
3回答

海绵宝宝撒

值得注意的是,我看到许多用户建议迭代INSERT语句,而不是像选择的答案那样构建单个字符串查询。我决定只使用两个字段和一个非常基本的INSERT语句运行一个简单的测试:<?phprequire('conn.php');$fname&nbsp;=&nbsp;'J';$lname&nbsp;=&nbsp;'M';$time_start&nbsp;=&nbsp;microtime(true);$stmt&nbsp;=&nbsp;$db-> prepare('INSERT&nbsp;INTO&nbsp;table&nbsp;(FirstName,&nbsp;LastName)&nbsp;VALUES&nbsp;(:fname,&nbsp;:lname)');for($i&nbsp;=&nbsp;1;&nbsp;$i&nbsp;<=&nbsp;10;&nbsp;$i++&nbsp;)&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;$stmt->bindParam(':fname',&nbsp;$fname); &nbsp;&nbsp;&nbsp;&nbsp;$stmt->bindParam(':lname',&nbsp;$lname); &nbsp;&nbsp;&nbsp;&nbsp;$stmt->execute(); &nbsp;&nbsp;&nbsp;&nbsp;$fname&nbsp;.=&nbsp;'O'; &nbsp;&nbsp;&nbsp;&nbsp;$lname&nbsp;.=&nbsp;'A';}$time_end&nbsp;=&nbsp;microtime(true);$time&nbsp;=&nbsp;$time_end&nbsp;-&nbsp;$time_start;echo&nbsp;"Completed&nbsp;in&nbsp;".&nbsp;$time&nbsp;."&nbsp;seconds&nbsp;<hr>"; &nbsp;&nbsp;&nbsp;&nbsp;$fname2&nbsp;=&nbsp;'J';$lname2&nbsp;=&nbsp;'M';$time_start2&nbsp;=&nbsp;microtime(true);$qry&nbsp;=&nbsp;'INSERT&nbsp;INTO&nbsp;table&nbsp;(FirstName,&nbsp;LastName)&nbsp;VALUES&nbsp;'; &nbsp;&nbsp;&nbsp;&nbsp;$qry&nbsp;.=&nbsp;"(?,?),&nbsp;";$qry&nbsp;.=&nbsp;"(?,?),&nbsp;";$qry&nbsp;.=&nbsp;"(?,?),&nbsp;";$qry&nbsp;.=&nbsp;"(?,?),&nbsp;";$qry&nbsp;.=&nbsp;"(?,?),&nbsp;";$qry&nbsp;.=&nbsp;"(?,?),&nbsp;";$qry&nbsp;.=&nbsp;"(?,?),&nbsp;"; &nbsp;&nbsp;&nbsp;&nbsp;$qry&nbsp;.=&nbsp;"(?,?),&nbsp;";$qry&nbsp;.=&nbsp;"(?,?),&nbsp;";$qry&nbsp;.=&nbsp;"(?,?)";$stmt2&nbsp;=&nbsp;$db->prepare($qry);$values&nbsp;=&nbsp;array();for($j&nbsp;=&nbsp;1;&nbsp;$j<=10;&nbsp;$j++)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;$values2&nbsp;=&nbsp;array($fname2,&nbsp;$lname2); &nbsp;&nbsp;&nbsp;&nbsp;$values&nbsp;=&nbsp;array_merge($values,$values2); &nbsp;&nbsp;&nbsp;&nbsp;$fname2&nbsp;.=&nbsp;'O'; &nbsp;&nbsp;&nbsp;&nbsp;$lname2&nbsp;.=&nbsp;'A';}$stmt2->execute($values);$time_end2&nbsp;=&nbsp;microtime(true);$time2&nbsp;=&nbsp;$time_end2&nbsp;-&nbsp;$time_start2;echo&nbsp;"Completed&nbsp;in&nbsp;".&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;$time2&nbsp;."&nbsp;seconds&nbsp;<hr>";?>虽然整个查询本身花费了毫秒或更短的时间,但后者(单个字符串)的查询速度始终是原来的8倍或更快。如果这是为了反映更多列上数千行的导入,则差异可能是巨大的。
随时随地看视频慕课网APP
我要回答