选择中奖彩票时出现数组错误。

Posted

技术标签:

【中文标题】选择中奖彩票时出现数组错误。【英文标题】:Array error when picking winning ticket. 【发布时间】:2017-07-15 20:15:54 【问题描述】:

任何人都可以在这里发现任何错误吗?很抱歉再次询问,但我是新来的,在发帖时不太确定该怎么做。

$stmt = $db->prepare('INSERT INTO `giveawayusers` (`giveawayid`, `steamid64`, `coins`, `from`, `to`) VALUES (:id, :id64, :coins, :from, :to)');
    $stmt->execute(array(
                ":id"  => $id,
                ":id64"       =>  $steamUserId,
                ":coins"  => $coins,
                ":from"       =>  $currentCoins,
                ":to"  => $totalCoins,
            ));

if($currentCoins+$coins>=$totalCoins)

    $winningticket = mt_rand(1,$totalCoins);
    $stmt = $db->prepare('SELECT `steamid64` FROM `giveawayusers` WHERE `from` <= :winningticket AND `to` >= :winningticket AND `giveawayid`=:id');
        $stmt->bindValue(':id', $id);
        $stmt->bindValue(':winningticket', $winningticket);
        $stmt->execute();
        $winner = $stmt->fetch();

我相信错误可能在这里

$stmt = $db->prepare('SELECT `steamid64` FROM `giveawayusers` WHERE `from` <= :winningticket AND `to` >= :winningticket AND `giveawayid`=:id');

我的数据库结构是这样的:

https://gyazo.com/4ec4874d879b2cf4bd1d2450e57cfa71 https://gyazo.com/95cddb0a1c7b8fd1c360a6d5a1b2e129

干杯, 詹姆斯

【问题讨论】:

你得到了什么错误之王?我不确定这里有什么问题。 获胜者未被选中。看看 skin-room.com 你就会明白 所以您的查询结果为空? 是的。试图弄清楚如何解决它 硬币 (2) 和当前硬币 (2 或 4) 中的数字太高。 mt_rand(1,$totalCoins) 的结果为 0、1 或 2。您在表中的硬币和总硬币的大量数据会产生高于 2 的结果,从您的查询中返回一个空结果集。 【参考方案1】:

我认为我们不允许在准备好的语句中多次引用命名绑定占位符。 (在 PDO 的早期版本中确实如此,不确定您正在运行的版本中是否已修复。)

我建议使用 unique 绑定占位符名称。可以为多个占位符提供相同的值。举个例子:

    $stmt = $db->prepare('SELECT `steamid64` FROM `giveawayusers`'
                       . ' WHERE `from`      <= :winningticket1'
                       .   ' AND `to`        >= :winningticket2'
                       .   ' AND `giveawayid` = :id'
            );
    $stmt->bindValue(':winningticket1', $winningticket);
    $stmt->bindValue(':winningticket2', $winningticket);
    $stmt->bindValue(':id', $id);
    $stmt->execute();

但如果这是问题所在,那么我不会将观察到的行为描述为“数组错误”。

该描述相当模糊,并且具有误导性的不精确性。如果这是错误的原因,那么是 execute 引发错误(而不是准备),我希望错误消息包括提及无效数量的绑定参数“或类似的东西。我们应该包括描述我们观察到的行为时的准确错误消息,而不是模糊的概括。


如果这不是错误的原因,如果execute 成功,那么正如@TopCheese 在评论中提到的那样,查询执行返回空结果集是有效的。在这种情况下,我看不出问题中显示的代码会如何引发“数组错误”。

【讨论】:

Re: 多次命名绑定占位符 - 如果 PDO::ATTR_EMULATE_PREPARES 设置为 true(这应该是默认设置),则有可能。 对绑定占位符使用唯一名称对于 ATTR_EMULATE_PREPARES 的任一设置均有效。我的偏好是写一个适用于任何一种情况的语句。我不认为更改 PDO::ATTR_EMULATE_PREPARES 的设置应该“破坏”一条 SQL 语句。 是的,我可能是在和自己约会。【参考方案2】:
 WHERE `from` >= :winningticket AND `to` <= :winningticket

【讨论】:

纯代码答案质量非常低,可以删除。至少需要用一句话描述您要回答的问题以及如何回答。

以上是关于选择中奖彩票时出现数组错误。的主要内容,如果未能解决你的问题,请参考以下文章

用循环与数组模拟双色球彩票中奖

尝试选择两列时出现 np.where 错误

彩票的预测

为啥插入子文档数组时出现“重复键错误”?

为啥插入子文档数组时出现“重复键错误”?

初始化数组时出现段错误