【问题标题】:Mysqli Prepare Statement - Returning False, but Why? [duplicate]Mysqli Prepare 语句 - 返回 False,但为什么? [复制]
【发布时间】:2010-11-16 05:30:34
【问题描述】:

我有一个函数,它根据要插入该列的列名和值的关联数组以及表名(简单字符串)生成准备好的 INSERT 语句:

function insert ($param, $table) {
        $sqlString = "INSERT INTO $table (".implode(', ',array_keys($param)).') VALUES ('.str_repeat('?, ', (count($param) - 1)).'?)';
        if ($statement = $this->conn->prepare($sqlString)):
            $parameters = array_merge(array($this->bindParams($param), $param));
            call_user_func_array(array($statement, 'bind_param', $parameters));
            if (!$statement->execute()):
                die('Error! '.$statement->error());
            endif;
            $statement->close();
            return true;
        else:
            die("Could Not Run Statement");
        endif;
    }

我的问题是 $this->conn->prepare(它是一个类的一部分,conn 是一个新的 mysqli 对象,可以正常工作)返回 false,但没有给我一个理由!

这是为准备语句构建的示例 $sqlString:

INSERT INTO students (PhoneNumber, FirstName, MiddleInit, LastName, Email, Password, SignupType, Active, SignupDate) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)

谁能看出这个参数化语句有问题?准备函数返回 false 的任何原因?

【问题讨论】:

  • 您是否收到错误消息(请参阅 php.net/manual/en/mysqli.error.php 当 prepare 返回 false 时?);如果是,那是什么?
  • 您是否尝试过在数据库中运行实际的 INSERT 语句,以查看您的 SQL 是否正确?
  • 我刚刚打开了 mysqli_report(MYSQLI_REPORT_ALL) 以更好地了解正在发生的事情 - 结果我的一个字段名称不正确 - 你会认为 prepare() 会抛出异常,但它默默地失败了。
  • @Pascal - Prepare() 出错时返回 false,它不返回我可以读取的实际错误,它只是失败了。
  • @Andrew :这就是为什么我建议使用应该指示错误消息的方法/属性。反正:你的问题解决了吗? (从您之前的评论来看,似乎是,但我更愿意确定)

标签: php mysqli prepared-statement


【解决方案1】:

我将解决方案复制到此答案中,以便对此进行投票,否则该问题将永远出现在“未回答的问题”中。我将这个答案标记为 CW,所以我不会得到任何分数。

@Andrew E. 说:

我刚打开 mysqli_report(MYSQLI_REPORT_ALL) 到 更好地了解什么是 继续 - 原来是我的一个 字段名称不正确 - 你会 认为prepare() 会抛出一个 异常,但它会静默失败。

【讨论】:

  • @P5Coder,PHP 和 MySQL 是最糟糕的解决方案,除了已经尝试过的所有其他解决方案。 :-)
  • @BillKarwin 您一定从未尝试过其他高级语言或数据库。 PHP 可以说是有史以来设计最糟糕的语言,而 MySQL 使用其默认引擎不符合 ACID。
  • @vee_ess,自 2010 年发布的 MySQL 5.5 以来,默认引擎是 InnoDB。InnoDB 支持 ACID 和大多数其他数据库一样。
  • @BillKarwin 关于 InnoDB 成为最近版本的默认引擎,这是一个很好的观点。在考虑 IO 和内存性能或可扩展性时,它肯定仍然不比 SS、DB2 或 Oracle(所有 ACID 兼容)更好。
  • @vee_ess,每个 RDBMS 都需要仔细调整和持续监控以使其正常工作。他们都有自己的特质。但是 MySQL 具有免费的优势。我曾咨询过数十家依靠 MySQL 取得相当成功的公司。但你当然有权发表你的意见。
【解决方案2】:

这些是我遇到此问题的主要原因。

  • 查询错误
  • 尝试同时运行两个查询(命令不同步)

首先你需要知道确切的原因。为此,请添加以下代码。

if ($stmt === FALSE) {
   die ("Error: " . $mysqli->error);
}

如果您同时运行两个查询,存储第一条语句中的值将解决问题。

$first_stmt->store_result()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-10
    • 1970-01-01
    • 2022-11-20
    • 2012-01-31
    • 1970-01-01
    • 2015-05-06
    • 1970-01-01
    相关资源
    最近更新 更多