【问题标题】:Faster way to run long PDO insert statement?运行长 PDO 插入语句的更快方法?
【发布时间】:2012-06-27 04:13:23
【问题描述】:

所以我开始将我所有的 mysql/php 工作数据库查询等切换到 PDO。我想知道是否可以以某种方式缩短以下方法。这个特殊的例子是使用一个大的注册表单并将结果插入到数据库中。我觉得这比必要的代码多得多......有没有更短的方法可以将它插入数据库?

$query = $affiliates->prepare('INSERT INTO affiliates (afid, afTitle, afbio, afLink, afEmail, afAddress, afCity, afState, afZip, afphone, affacebook, aflinkedin, aftwitter, afPassword, afLon, afType, aftime, afApproved) VALUES (?, ?, ? , ? , ?, ? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,?, ?)');
echo "prepare successfull";

$query-> execute(array('',$afTitle, $afBio, $afLink, $afEmail, $afAddress, $afCity, $afState, $afZip, $afPhone, $afFacebook, $afLinkedIn, $afTwitter, $afPassword, '', $afType, $date, $afApproved))or die(print_r($affiliates->errorInfo(), true));
echo "Insert worked!";

正如我所说,我对任何不良结构表示歉意,边学习边学习。这也能防止 sql 注入吗?

谢谢!

【问题讨论】:

  • 您可能会丢失echoor die(),但这与它所得到的一样紧凑。从处理更改表声明的人那里获取 if:您确实希望明确命名每一列。当然,任何设置为 default 值的字段都可以跳过。
  • 丢失未提供值的列。在各种框架中也有 PDO 的包装器,它们允许您在一次调用中将名称的关联数组发送到值,并为您创建实际的 SQL。
  • 谢谢大家,我不确定。 @Cfreak所以如果我没有在我的示例的第一个字段中插入数据''我不需要在sql中包含它,我假设我只是跳过它?
  • @Zanrok - 如果您未指定字段的值,则插入时将产生默认值。看起来 afid 可能是您使用 auto_increment 设置的列?如果是这种情况,那么您当然不需要尝试将值设置为 ''。
  • @ghbarratt 是的。非常感谢,仍然有很多代码,但至少我可以取出一些。 =/

标签: php mysql html pdo


【解决方案1】:

一种选择可能是将这些列名和值放入一个数组中。然后,您可以只使用数组,而不是多次列出所有变量/列。例如,您可以将代码更改为如下所示:

$inserting = array();
foreach(array('afTitle','afbio','afLink','afEmail','afAddress','afCity','afState','afZip','afphone','affacebook','aflinkedin','aftwitter','afPassword','afType','aftime','afApproved') as $i) $inserting[$i] = ${$i};

$sth = $dbh->prepare('INSERT INTO affiliates ('.implode(',', array_keys($inserting)).') VALUES ('.str_pad('', count($inserting)*2-1, '?,').')');
$sth->execute(array_values($inserting)) or die(print_r($sth->errorInfo(), true));

如果您喜欢这种方法,您可能会考虑以不同的方式填充数组,并可能放弃创建如此多的单个变量。

【讨论】:

  • 再次感谢!我可能会坚持我现在拥有的代码,因为它对我来说不那么令人困惑。但是感谢您的建议,我以后可能会尝试修改类似的想法。
猜你喜欢
  • 1970-01-01
  • 2012-12-16
  • 2014-08-12
  • 1970-01-01
  • 2016-03-02
  • 1970-01-01
  • 2016-01-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多