首页  >  问答  >  正文

"仅处理MySQL IN数组的第一个值"

<p>我正在使用PHP编程来创建一个PDO语句。</p> <p>PDO预处理语句如下:</p> <p><code>更新`log` SET `id` = ? WHERE `id` IN ( ? );</code></p> <p><code>IN</code>数组中的变量内容是整数。</p> <p>第一个<code>?</code>是一个单独的整数。第二个<code>?</code>是一个整数数组,所以我将它们连接成字符串<code>1,2,3</code>,这个字符串通常适用于<code>IN</code>数组。</p> <p>所以完整的代码如下:</p> <pre class="brush:php;toolbar:false;">public function mergeIDs($newID,$changeTheseIDs){ // (integer and array of integers, respectively) $inSet = implode(',',$changeTheseIDs); $query = $this->connect()->prepare("UPDATE `log` SET `id` = ? WHERE `id` IN ( ? );"); $query->execute([$newID,$changeTheseIDs]); }</pre> <p><strong>问题似乎是SQL只处理插入到<code>IN</code>数组中的第一个整数ID。</strong>与<code>IN</code>数组中的整数匹配的任何ID都应该被更改。</p> <p>如果我在我的服务器上的SQL工具中以这样的方式运行SQL:</p> <p><code>更新 `log` SET `id` = 5 WHERE `id` IN (1,2,3);</code></p> <p>它可以正常工作,我将所有ID为1、2或3的ID都更改为5。</p> <p>但是我的PDO版本只将1更改为5,2和3保持不变。</p> <p>有什么想法吗?</p>
P粉921165181P粉921165181437 天前472

全部回复(2)我来回复

  • P粉216203545

    P粉2162035452023-09-02 09:56:29

    尝试类似这样的代码:

    public function mergeIDs($newID,$changeTheseIDs){ //(分别为整数和整数数组)
    $mergeSet = array_merge([$newID],$changeTheseIDs);
    $marks = array_fill(0, count($changeTheseIDs), '?');
    $query = $this->connect()->prepare("UPDATE `log` SET `id` = ? WHERE `id` IN (". implode(',',  $marks) .");");
    $query->execute($mergeSet);
    }

    回复
    0
  • P粉446800329

    P粉4468003292023-09-02 00:11:20

    你需要为IN子句中的每个整数准备一个?,不能只有一个。

    public function mergeIDs($newID,$changeTheseIDs){ //(分别是整数和整数数组)
        $inPH = implode(',', array_fill(0, count($changeTheseIDs), '?'));
        $query = $this->connect()->prepare("UPDATE `log` SET `id` = ? WHERE `id` IN ( {$inPH} );");
        $query->execute([$newID, ...$changeTheseIDs]);
    }

    回复
    0
  • 取消回复