Php 如何使用bindParam编写更少的代码?

Php 如何使用bindParam编写更少的代码?,php,pdo,bindparam,Php,Pdo,Bindparam,我使用PDO将数据插入表中。问题是,有很多列,这意味着查询很长 这是我目前拥有的代码: $stmt = $con->prepare("INSERT INTO table (crips, biscuits, chocolate, cakes, smarties, yogurts, apples, oranges) VALUES (:crisps, :biscuits, :chocolate, :cakes, :smarties, :yogurts, :apples, :oranges)");

我使用PDO将数据插入表中。问题是,有很多列,这意味着查询很长

这是我目前拥有的代码:

$stmt = $con->prepare("INSERT INTO table (crips, biscuits, chocolate, cakes, smarties, yogurts, apples, oranges) VALUES (:crisps, :biscuits, :chocolate, :cakes, :smarties, :yogurts, :apples, :oranges)");
$stmt->bindParam(':crisps', $crisps);
$stmt->bindParam(':biscuits', $biscuits);
$stmt->bindParam(':chocolate', $chocolate);
$stmt->bindParam(':cakes', $cakes);
$stmt->bindParam(':smarties', $smarties);
$stmt->bindParam(':yogurts', $yogurts);
$stmt->bindParam(':apples', $apples);
$stmt->bindParam(':oranges', $oranges);
$stmt->execute();
是否有一种更简单的方法,而不是为每个值使用不同的代码行

这样的事情可能吗

foreach(value) {
   $stmt->bindParam(':value', $value);
}

您可以使用
标识符并按顺序输入值:

$stmt = $con->prepare("
  INSERT INTO table 
    (crips, biscuits, chocolate, cakes, smarties, yogurts, apples, oranges) 
  VALUES 
    (?, ?, ?, ?, ?, ?, ?, ?)
");

$stmt->execute([$crisps, $biscuits, $chocolate, $cakes, $smarties, $yogurts, $apples, $oranges]);
它已经节省了大量代码,
:命名的
参数有其用途,但不能与
结合使用


可以使用循环,但首先需要预定义的数组来循环

对于命名参数,创建如下数组:

$list = [
  ':crisps' => $crisps,
  ':biscuits' => $biscuits,
  # etc
];

foreach($list as $k => $v){
  $stmt->bindValue($k, $v);
}

$stmt->execute();
对于
索引参数:

$list = [
  $crisps,
  $biscuits,
  #etc
]

foreach($list as $k => $v){
  $stmt->bindValue($k+1, $v);
}

$stmt->execute();
请注意,我已将方法从
bindParam()
更改为
bindValue()
,正如在您的代码示例中一样,使用该方法没有任何好处

然后是使用
bindValue()
的问题,因为该方法唯一的传统特征是它能够使用
3th
参数将值强制转换为特定类型,这是您无论如何都不会做的事情

因此本质上,您可以通过直接在
execute()
方法中输入
$list
来避免
foreach
循环:

$stmt->execute($list);
如果确实要使用
bindParam()
,则只需在变量名之前添加引用符号:

$list = [
  ':cakes' => &$cakes
];

您的foreach可以使用,但您需要构建该数组,该数组仍然需要几行代码
--马克·贝克

这是非常正确的


注意:请说明我为什么使用
BindValue
而不是
BindParam
。谢谢你的提醒

代码看,如果你真的那么在乎代码行,那么我建议你自己构造一个数据库交互类,你可以用它来做这些事情。一旦编写了类,它将为您节省代码布局重复

您关于使用
foreach
的想法并不遥远,可以用来节省一些重复,例如,您可以构造一个数组(其中引用变量名是关键),将每个变量与其各自的SQL占位符紧密关联

因此:

这将用变量集合(数组)替换独立变量(
$crisps
等),数组键是引用名称

然后

注意:我没有在这里加入任何安全清理或检查例程,因为这有点超出范围,但我建议这样做(a
preg\u replace
或类似),以确保事先从键值中删除无效字符

例如:

$key = preg_replace("/[^a-z]/i","",$key);


你确定我需要一个预定义的数组吗?它还能再简化吗,因为$v总是和$k一样,只是前面有一个$(如果你明白我的意思的话)?
--码表


问题是,由于变量没有收集到数组或对象中,代码如何知道要添加到
INSERT
SQL中的变量?您仍然需要为每一行代码编写一行代码

Xorifelse已经把这个话题讲清楚了,所以我只能做一个很小的补充。在PHP中,您总是可以找到一个奇怪的函数,它可以帮助您做一些奢侈的事情

因此,如果您喜欢使用命名占位符,您可以保留它们,但仍可以使用execute()的快捷方式:


但就我个人而言,我更喜欢位置占位符。

将参数传递给
execute()
。类似的问题
是否可能这样是。确切地你已经开始回答你自己的问题,现在跟随/探索这个答案,看看它会把你引向何方……谢谢你的建议。我可以尝试使用
,但是如果我能像我在问题中建议的那样使用
foreach
,我真的很想使用。你的foreach可以使用,但你需要构建那个数组,这仍然需要几行代码这个答案似乎过于关注作为插入的SQL和语法快捷方式,而不是
INSERT
提供的。
UPDATE
SQL或
SELECT
语句会发生什么?还有未识别的
在引用变量方面是一种倒退,而不是前进。@Martin嗯,问题是如何缩短代码的php部分。你确定我需要这样一个预定义数组吗?它还能被简化吗,因为
$v
总是和
$k
一样,只是前面有一个
$
(如果你明白我的意思的话)?在创建我的答案之前,我也错过了一些东西,
bindParam()
!=
bindValue()
那么像您这样定义数组有点否定了
bindParam()
@Xorifelse的用法,很抱歉我不理解您的引用?啊,等等,你是说因为它是
BindParam
它不会接受通过引用传递的值吗?哦,是的……我忘了。。。。ffsI遗漏了我在回顾旧答案/评论时必须做的事情。所以你知道为什么。(对@YourCommonSense上的一些体育精神表示赞赏)我不知道为什么会有人投反对票,
extract()
EXTR\u REFS
compact()
齐头并进。它可以与bindParam()完美结合使用。
foreach($save as $key=>$value){ 
    $stmt->bindValue(":".$key, $value);
}
unset($key,$value);
$key = preg_replace("/[^a-z]/i","",$key);
$stmt = $con->prepare("INSERT INTO table (crips, biscuits, chocolate, cakes, smarties, yogurts, apples, oranges) VALUES (:crisps, :biscuits, :chocolate, :cakes, :smarties, :yogurts, :apples, :oranges)");
$stmt->execute(compact('crisps', 'biscuits', 'chocolate', 'cakes', 'smarties', 'yogurts', 'apples', 'oranges'));