【问题标题】:DBAL inside of for loop doesn't work properlyfor 循环内的 DBAL 无法正常工作
【发布时间】:2017-08-16 11:32:20
【问题描述】:

我在一个较长的shopware插件中创建了一个函数,它应该为数据库中“vouchercode”列中具有“NULL”值的每一行创建一个随机数。现在我用一个固定的数字替换了for循环条件,因为我想确保问题不会因为for循环条件而发生。

问题是,for循环只对数据库产生一次影响。

例如:我有这张表's_plugin_tnev'。该表内部有 6 行。其中 4 个在凭证代码列中具有“NULL”作为值。

据我了解我的代码。它应该在同一个表中循环 5 次,并且每次更新其中一个“NULL”值列,同时在每个循环之后,这些“NULL”值列之一应该填充一个随机数,因此不再被 SELECTed 或由这个 for 循环更新。

尽管如前所述,这不会发生。 for 循环显然只工作一次。

这是我的代码 sn-p:

public function generateCode()
{
  //Repeat action 5 times
  for($i = 0; $i <= 4; $i++) 
  {
    $rand   = 0;
    //Creates 16 times a number and add it to the var
    for ($i = 0; $i<15; $i++)
        {
            $rand .= mt_rand(0,9);
        }
        //On Checkoutcomplete add $rand to database table
        $addInt    = "UPDATE s_plugin_tnev SET vouchercode = $rand 
                      WHERE vouchercode IS NULL
                      LIMIT 1";
        $connect = Shopware()->Db()->query($addInt);
  }
}

如您所见,我使用 DBAL 框架,因为这是 Shopware 支持的最佳方式。

我的想法是错误与 $connect 变量有关,或者 DBAL 与数据库的通信速度不够快

也许有人对 DBAL 有更多经验,可以帮助我。

提前致谢, 最大K

【问题讨论】:

    标签: php sql doctrine dbal shopware


    【解决方案1】:

    您有两个带有$ifor 循环,因此在您的第一次迭代中,最后$i 的值为15,第一个循环只执行一次。

    试试这个:

    public function generateCode()
    {
      //Repeat action 5 times
      for($i = 0; $i <= 4; $i++) 
      {
        $rand   = 0;
        //Creates 16 times a number and add it to the var
        for ($j = 0; $j<15; $j++) // $j NOT $i <---
        {
            $rand .= mt_rand(0,9);
        }
        //On Checkoutcomplete add $rand to database table
        $addInt    = "UPDATE s_plugin_tnev SET vouchercode = $rand 
                      WHERE vouchercode IS NULL
                      LIMIT 1";
        $connect = Shopware()->Db()->query($addInt);
      }
    }
    

    【讨论】:

    • 遗憾的是,这不是问题所在。但还是谢谢你。两次使用相同的变量字母是非常糟糕的做法。
    • 那么,还是不行?或者你找到解决办法了吗?
    • 嗯...我使用了 sleep() 方法。虽然我真的不喜欢这个解决方案,但希望有更好的解决方案。
    猜你喜欢
    • 2017-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-30
    相关资源
    最近更新 更多