Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何跳过PHP mysqli中的非对象错误?_Php_Mysql_Mysqli_Syntax Error_Fatal Error - Fatal编程技术网

如何跳过PHP mysqli中的非对象错误?

如何跳过PHP mysqli中的非对象错误?,php,mysql,mysqli,syntax-error,fatal-error,Php,Mysql,Mysqli,Syntax Error,Fatal Error,当经典PHP mysql中的SQL语法出现错误时,查询将不会发生,而不会产生任何其他影响。但在mysqli中,它会导致PHP脚本死机,并出现致命错误 mysql_query("SELECT title, misspelled_column FROM posts"); $mysqli->query("SELECT title, misspelled_column FROM posts"); 在第一种情况下,它将显示其他查询和php输出;但第二个案例通过以下方式终止了脚本 Fatal er

当经典PHP mysql中的SQL语法出现错误时,查询将不会发生,而不会产生任何其他影响。但在mysqli中,它会导致PHP脚本死机,并出现致命错误

mysql_query("SELECT title, misspelled_column FROM posts");

$mysqli->query("SELECT title, misspelled_column FROM posts");
在第一种情况下,它将显示其他查询和php输出;但第二个案例通过以下方式终止了脚本

Fatal error: Call to a member function fetch_assoc() on a non-object
该问题与假查询返回的
非对象
有关。我可以跳过这个错误

if($result){$row = $result->fetch_assoc();}

但我的问题是,为什么我在classic
mysql
中不需要这个检查?有了更先进的系统,人们希望新功能不会丢失我们已有的功能。

根据我的经验,SQL错误不会杀死mysqli。我怀疑您在相关语句中确实存在PHP错误。检查您的错误日志


在PHP中,可以使用
@
来抑制错误。在这里使用它是个坏主意。但如果这是你真正想要的,它会记录在

MySQL生成的错误不应停止执行。事实上,您可以使用
$mysqli->error
(假设
$mysqli
是您的数据库连接,如您的示例中所示)让脚本显示任何SQL错误。然而,可能发生的情况是,mysqli错误导致无法创建特定对象,然后对该对象调用方法将创建一个致命的PHP错误。例如:

$dbconn = new mysqli("localhost", $username, $password, $dbname);
$stmt = $dbconn->prepare("bluh"); // not a valid statement. fails to create a mysqli statement object in $stmt.
echo($dbconn->error); // your script is still running, and this will show your MySQL syntax error.
$stmt->execute();
这不会因为您犯了SQL错误而消失,而是因为
$stmt
为null并且没有预期的
execute()
方法。所以就像其他人说的,检查日志,看看实际的错误是什么

使用
@
忽略错误将是命中还是未命中,直到您确定是哪个特定命令创建了错误

更新:如果您知道查询中存在错误,则可以在尝试对其执行任何操作之前检查查询是否成功。一种方法是检查
错误
参数;另一个是检查以确保它确实返回了您想要的对象类型

以下是两者的示例:

$result = $db->query("select firstname, lastname from people where firstname = 'egbert';");
if($db->error == '') {
     // the query worked, so fetch results from $result and do stuff with them.
}
else {
     // the query didn't work, so don't try to do anything with $result
}

// alternately:
if(gettype($result) == "object") {
     // the query worked.
}
else {
     // it didn't.
}

修正错误。问题解决了。您不需要处理MySQL语法错误,因为这些错误应该在开发阶段处理。而且永远不要使用错误抑制操作符来做类似的事情。请包含错误消息。我同意,mysqli使用起来不如mysql方便,这有时看起来很奇怪。另一方面,mysqli禁止你做的大多数事情都是我们一开始就不应该做的。两个大的例子是编写非参数化查询或尝试使用查询结果而不确保它们存在。能够做到这一点可能很方便,但这也是一个巨大的安全漏洞或等待发生的应用程序崩溃。这不是“通常”,但总是一个坏主意。这显然不是OP需要的。一个常见的“我只看问题标题,不看身体”的答案。“如何忽略错误”关键字触发自动回答。没有思想牵连。我想知道为什么没有这样一个功能,使爱好者过时。@Col.Shrapnel这个故事和你说的不一样。由于语法错误,我的PHP设置中应该存在导致致命错误的内容。因为我最近从mysql搬到了mysqli;我问是否有人可以给我一个如何设置PHP以避免这种情况的提示;但我不知道如何避免致命错误,因为mysqli没有对象输出。在这种情况下,发布实际上会给您带来错误的代码可能会有所帮助——您在问题中给出的示例代码是不够的。您可以测试查询是否成功,如果失败,则跳过任何进一步的操作。我已经用一个例子更新了我的答案。另外,我认为你的问题仍然是错误的:在你的查询中拼写错误的列不会导致脚本死亡。只有当您尝试对错误查询的结果执行某些操作时,它才会消失。