如何在不重复参数的情况下将参数绑定到多个值

时间:2018-12-07 11:14:52

标签: php mysql sql prepared-statement bindparam

我准备好的陈述看起来像这样:

$stmt20 = $conexao->prepare("
        INSERT INTO esc_usuarios_pgtoparcelas (parcela_codigo_plano, parcela_mes, parcela_valorBonificacao, parcela_situacao)
        VALUES
        (LAST_INSERT_ID(), ?, ?, ?),
        (LAST_INSERT_ID(), ?, ?, ?)
        ");
$stmt20->bind_param('sdssds', $m1, $zero, $parcela_situacao_prog, $m2, $zero, $parcela_situacao_prog);
$stmt20->execute();

如您所见,除了$m1$m2之外,这些参数都在重复。我可以将这些重复的参数绑定到多个值并保留这些m1m2吗?即使必须插入许多值,绑定顺序也不会改变。

2 个答案:

答案 0 :(得分:0)

您需要使用命名参数,而不是使用问号参数。参见the php docs

$stmt20 = $conexao->prepare("
        INSERT INTO esc_usuarios_pgtoparcelas (parcela_codigo_plano, parcela_mes, parcela_valorBonificacao, parcela_situacao)
        VALUES
        (LAST_INSERT_ID(), :m1, :zero, :parcela_situacao_prog),
        (LAST_INSERT_ID(), :m2, :zero, :parcela_situacao_prog)
        ");
$stmt20->execute(array(
    ':m1' => $m1, 
    ':m2' => $m2, 
    :zero => $zero, 
    :parcela_situacao_prog => $parcela_situacao_prog 
));

答案 1 :(得分:0)

通常,您不会尝试像这样加倍,只需准备一次语句,然后使用不同的值运行两次。我不是PHP编码员,所以我从GMB的帖子中借来的:

DECLARE @tbl TABLE(id INT,fieldname varchar(max),fieldvalue varchar(max));
insert into @tbl VALUES(1,'lastname','hugo')
                      ,(2,'age','23')
                      ,(1,'ID','12')
                      ,(2,'LastName','test');

SELECT t.id
      ,MAX(CASE WHEN t.fieldname='ID' THEN t.fieldvalue END) AS ID
      ,MAX(CASE WHEN t.fieldname='LastName' THEN t.fieldvalue END) AS LastName
      ,MAX(CASE WHEN t.fieldname='Age' THEN t.fieldvalue END) AS Age
      ,MAX(CASE WHEN t.fieldname='externalId' THEN t.fieldvalue END) AS externalId
FROM @tbl t
GROUP BY t.id

如果要插入1000个值,则只需准备一次语句并执行1000次(循环)即可。

$stmt20 = $conexao->prepare("
        INSERT INTO esc_usuarios_pgtoparcelas (parcela_codigo_plano, parcela_mes, parcela_valorBonificacao, parcela_situacao)
        VALUES
        (LAST_INSERT_ID(), :m, :zero, :parcela_situacao_prog)
        ");

$stmt20->execute(array(
    :m => $m1, 
    :zero => $zero, 
    :parcela_situacao_prog => $parcela_situacao_prog 
));

$stmt20->execute(array(
    :m => $m2, 
    :zero => $zero, 
    :parcela_situacao_prog => $parcela_situacao_prog 
));

在mysqli的php帮助文档中进行挖掘,我想适合您情况的代码可能更像:

$stmt20 = $conexao->prepare("
        INSERT INTO esc_usuarios_pgtoparcelas (parcela_codigo_plano, parcela_mes, parcela_valorBonificacao, parcela_situacao)
        VALUES
        (LAST_INSERT_ID(), :m, :zero, :parcela_situacao_prog)
        ");

for ($x = 0; $x <= 1000; $x++) {
  $stmt20->execute(array(
    :m => $array_of_m[$x], 
    :zero => $zero, 
    :parcela_situacao_prog => $parcela_situacao_prog 
  ));
}

简而言之,我试图克服这种想法:您只需设置一次,然后jsut更改值并重复调用execute ..

请注意,我不是PHP程序员。我引用了此内容:PHP/mysql: mysqli prepared statement insert same value multiple times within for loop