当前位置: 首页 > 面试题库 >

mysqli_stmt :: execute()返回false,语句未执行

贝杜吟
2023-03-14
问题内容

通过将用户的IP,失败的尝试次数和最后的尝试时间记录到名为的MySQL数据库表中,我有一种简单的登录系统保护机制bannedusers。但是,当我尝试使用以下代码在数据库中插入新条目时,execute()函数将返回false并无法执行。

代码如下:

private $con;

function updateTable($IP, $attempt, $exists){
    $time = time();

    //The following statement is actually in the constructor, moved here for completeness
    $this->con = new mysqli(DB_SERVER, DB_USER, DB_PASSWORD, DB_NAME); //All these constants are predefined and verified to be correct.

    if($this->con->connect_error){
        return true; //If there is a connection error, just let the user log in... We'll deal with this later
    }

    //Another function already determines if the entry exists or not.
    if(!$exists){
        //ip, retrycount, attempttime are the name of the fields. IP is a 40-char wide VARHCAR, retrycount is a tinyint and attempttime is a big int.
        $query = "INSERT INTO bannedusers (ip, retrycount, attempttime) VALUES (?,?,?)";

        if($stmt = $this->con->prepare($query)){

            //This following statement executes without throwing errors and returns true.
            $stmt->bind_param('sii', $IP, $attempt, $time);

            $successful = $stmt->execute();
            $stmt->close();

            if(!$successful){
                //Causes a small dialog to appear telling you the query failed.
                echo "<script type='text/javascript'>alert('Failed query!');</script>";
            }
        }
    }else{
        //Unrelated code omitted.
    }
}

我是php和MySQL的新手,通过研究,我发现SQL语法显然需要在查询的VALUE部分的字段周围加上引号,例如:

$query = "INSERT INTO bannedusers (ip, retrycount, attempttime) VALUES ('?','?','?')";

但是我在这里发现它实际上使查询停止工作(仍然尝试过并在bind_param()上收到错误)。我尝试将类型更改为’sii’或’sss’或’ssi’,这都导致查询失败。我尝试在SQL查询的末尾添加分号,但这没有任何改变。在所有情况下,“查询失败!”
对话框弹出,没有其他错误(除了上面提到的错误之外,我在VALUES字段周围使用了引号。

任何帮助表示赞赏。

更新:

事实证明,$ip在以某种方式null传递给该函数之前,该函数仅在将MySQL错误级别提高到MYSQLI_REPORT_ALL时才会导致错误。


问题答案:

要么将mysqli设置为异常模式

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

或始终检查每个mysqli操作的结果并手动引发mysqli错误:

$result = $stmt->execute();
if (!$result) {
    throw new Exception($mysqli->error);
}

这是知道您的execute()出了什么问题的 唯一 方法;

我发现SQL语法显然需要在VALUE的字段周围加上引号

当然是错的。SQL语法显然只需要在 字符串 两边加上引号。



 类似资料:
  • 问题内容: from pandas import DataFrame import pyodbc 可以填充我的pandas DataFrame。但是我怎么得到 直接从 光标 ?这些信息是否完全存储在 游标 中? 问题答案: 您可以从游标描述中获取列:

  • (在本例中,假设是的有效索引,并且代码不会引发) 编辑:问题不是关于使用的必要性,而是关于我选择这样做时在性能上的任何收益或损失。没有它,就会创建一个变量。使用它,返回的值被存储在其他地方,也许是以一种更有效的方式。

  • 问题内容: 我有一个名为 stmt的* Statement 对象,一个Connection对象 conn 。 *** 但这总是产生 假的 。如果上述查询成功执行,我想返回 true, 如果查询执行失败,我想返回 false 。如何使用 execute() 方法获得该结果。 问题答案: 如何使用execute()方法获得该结果。 你不能 只有结果为时,它才会返回。如果您的插入有问题,该方法将引发异常

  • 我不得不使用全局变量found来指示在哪里找到了一个和。返回语句始终未定义。 此外,如果在下面的if语句中使用return语句,代码将无法正常工作。 这不是问题的最佳解决方案,但这是我得到的工作版本。 返回语句之间的****,删除时代码工作,否则我要么得到false或未定义。我不明白这部分!为什么删除返回就能解决问题,我认为每个递归调用都必须用返回语句进行。 问题可能是由于多次呼叫造成的吗?我是不

  • 问题内容: 我正在扩展Chrome。好。将tampermonkey脚本转换为chrome扩展程序。我运行它,并在chrome控制台中给出以下错误: 是什么导致此问题? 尝试将我的代码包装在IIFE代码中: 尝试IIFE方法时出现以下错误: 问题答案: 你不能返回,除非你在一个函数中 您可以将所有代码包装在IIFE中 或者

  • 问题内容: 我有两个TSQL EXEC语句 如何使两个EXEC同步?; 现在,第二个EXEC不会等待第一个EXECUTE完成。我尝试发出WaitFor Delay,它等待,但是第二个EXEC语句永不恢复。 谢谢。 更新,这里是更多信息: 首先执行将创建一个全局临时表,并从一个复杂的SELECT查询中填充它。 第二个EXEC是CLR存储过程,它基于最近创建并填充的Global Temp表中的变量来生