【问题标题】:Result from 2nd query returned in 1st query第一个查询中返回的第二个查询的结果
【发布时间】:2013-03-27 20:47:39
【问题描述】:

在我的代码中,我正在检查数据库中是否存在值。如果确实存在,则应返回错误。但是,如果不存在,则应在数据库中创建该值。这是我的代码:

/**
 * Check if the string has been used before
 *
 * @return bool
 */
private function _checkStringBeenUsed ()
{
    echo "Running check!\n";

    if ($this->_sString === null) {
        parent::showErrorMessage('Invalid shared String', 1005);
    }

    $this->_validateString();

    $sSql     = "SELECT * FROM operator_string WHERE
                    operatorId = '{$this->_sOperator}' AND
                    sharedString = '{$this->_sString}' AND
                    time >= DATE_SUB(
                        NOW(),
                        INTERVAL 1 DAY
                    )";
    $rQur     = $this->_oDb->query($sSql);

    echo $sSql;
    echo "\n\n";
    echo "Rows: " . $rQur->num_rows;
    echo "\n\n";

    if ($rQur->num_rows > 0) {
        parent::showErrorMessage('Shared string already used', 1005);
    } else {
        $sSql = "INSERT INTO operator_string
                    (operatorId, sharedString, time, hash)
                    VALUES
                    ('{$this->_sOperator}',
                        '{$this->_sString}',
                        NOW(),
                        '{$this->_sHash}'
                    )";
        $this->_oDb->query($sSql);
    }
}

/**
 * Validates the string and the hash
 *
 * @return void
 */
private function _validateString ()
{
    $sHashString = $this->_sOperator . $this->_sSharedSecret . $this->_sString;
    $sHash = hash('sha256', $sHashString);

    if ($sHash != $this->_sHash) {
        parent::showErrorMessage('Invalid authentication hash send', 1006);
    }
}

这是我从 iPhone 运行命令时的输出:

2013-03-27 21:43:08.560 MyApp[45315:c07] Result: Running check!
SELECT * FROM operator_string WHERE
                        operatorId = 'a8198231u82' AND
                        sharedString = 'cqCEYGIbNvF7HU1' AND
                        time >= DATE_SUB(
                            NOW(),
                            INTERVAL 1 DAY
                        )

Rows: 1

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE error>
<error>
    <errorCode>1005</errorCode>
    <errorMessage>Shared string already used</errorMessage>
</error>

如果在调用运行之前表中没有数据,它怎么可能是 1 行?该方法只运行一次,插入完成执行选择之后。

编辑 1
如果我注释掉插入 SQL 行,它不会向数据库添加任何内容。

【问题讨论】:

  • 您确定$rQur-&gt;num_rows 包含有效值吗?
  • 是的。如果我转储 $rQur-&gt;fetch_assoc() 我会得到实际的行,那应该在几行之后添加。
  • 找到了。我在我的子类中添加了mysqli_autocommit($this, false);,这解决了这个问题。

标签: php mysql mysqli


【解决方案1】:

似乎autocommit 被默认设置为True。我在MySqli 的子类中使用mysqli_autocommit($this, false); 将其切换为false,它解决了我的问题。

【讨论】:

    猜你喜欢
    • 2015-03-16
    • 2018-12-18
    • 2013-11-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-09
    • 2012-10-10
    • 1970-01-01
    • 2018-07-30
    相关资源
    最近更新 更多