2017-10-13 99 views
0

以下是我在页面上提交新表单提交的代码。我一直在研究这一整天,并且声明在bind_param上失败。

$query = " INSERT INTO table 
            ( 
             AbandonedComments,           
             DetectorComments,           
             FireExComments,           
             PestComments,          
             SanitationComments 
            ) 
           VALUES 
            ( 
             ?,           
             ?,           
             ?,           
             ?,           
             ?; 
            )"; 
       $stmt = $mysqli->prepare($query); 
       $stmt->bind_param("sssss", 
         $_POST['GeneralComment'], 
         $_POST['SmokeDetectorComment'], 
         $_POST['fireExComments'], 
         $_POST['PestComments'], 
         $_POST['SanitationComments'] 
       ); 
$stmt->execute(); 
$stmt->close(); 

我已经在try/catch,if/else中包装了该部分,并且已经过测试以查看值是否经过。

  • 在try/catch语句没赶上,但没有成功或者
  • 的的if/else跑都不是。
  • 所有值都相应地通过。

我知道execute()可以错误检查,因为它返回一个布尔值,但我还没有找到bind_param上的任何东西。

编辑:我发布了这个帖子后,他指出了错误,并解释说没有错误检查'bind_param',但'准备'和'执行'将返回布尔值,你可以在那里检查。

+1

_返回TRUE成功或FALSE失败._ http://php.net/manual/en/mysqli-stmt.bind-param .php – AbraCadaver

+0

*“是否有错误检查$ stmt-> bind_param的方法?” - 我以前回答过这样的问题,并且没有办法检查'bind_param()'上的错误。我只需要找到它。 –

+0

也许别的东西失败了,这是什么?'; – AbraCadaver

回答

2

我认为你有一个分号插入错误

VALUES 
            ( 
             ?,           
             ?,           
             ?,           
             ?,           
             ?**;** 
            )" 
+1

好吧,但是.....有一个原因,它没有抛出一个错误;你知道为什么吗?我做。我希望你找到它并解释它。 –

+1

这是正确的答案,我现在还不能接受。查询起作用! – Liam

+0

@Liam为什么你在编辑中删除了分号? https://stackoverflow.com/revisions/46736498/3这个答案不适用于现在存在的问题。编辑好停止编辑。 https://stackoverflow.com/revisions/46736498/3 –

4
VALUES 
            ( 
             ?,           
             ?,           
             ?,           
             ?,           
             ?; <<< trailing semi-colon 

通知分号在那里?

它没有抛出错误的原因是因为在PHP和其他语言中,被认为是一个有效的字符,作为“语句的结尾”,位于所有占位符的末尾(请参阅编辑)。

参考:

如同在C或Perl,PHP要求指令,在每个语句的末尾分号结束。一段PHP代码的结束标记自动包含分号;你不需要用分号来终止PHP块的最后一行。块的结束标记将包括紧接着的换行符(如果存在的话)。

您声明查询(绑定)失败;它要么失败的原因,你没有检查真正的错误,或者它失败了,可能会发生。

您也无法检查绑定上的错误,您在查询时检查错误并报告错误,如果这也是PHP相关问题。

编辑:

然而,有您的查询阅读是这样的:

VALUES 
            ( 
             ?,           
             ?,           
             ?,           
             ?; <<< trailing semi-colon           
             ? 
            )"; 

...那么这将是一个完全不同的球赛,因为最后一个占位符永远不会被使用,并且语句停在第4个占位符处。

你可以并且应该通过modifiying你现在$stmt->execute();声明和使用!这是“没有”操作,转化为类似“如果查询没有执行”使用条件语句:

if(!$stmt->execute()) { 
    echo "Error: " . mysqli_error($mysqli); 
}else{ 
    echo "Success"; 
} 
2

语法检查在您拨打prepare()而不是bind_param()时完成。

$stmt = $mysqli->prepare($query) or die($mysqli->error); 

然而,bind_param()应该已经报告了一个错误,因为$stmtFALSE。它应该抱怨在非对象上调用方法。

2

正如@Barmar所示,如果您不启用例外,那么您必须检查每个mysqli调用以获得false的响应。 IIRC,每个mysqli函数在出错时都会返回false。

您应该配置mysqli来引发prepare()错误的异常。这不是它的默认设置,所以你必须启用它。但是如何从文档中做到这一点并不明显。

http://php.net/manual/en/mysqli-driver.report-mode.php显示了一个例子。

mysqli_report(MYSQLI_REPORT_STRICT); 

$link = mysqli_connect(...); 

执行此操作后,那么你的准备()应该提出,因为SQL语法错误的一个例外,在你的价值观子句中多余的分号,其他人已经指出。

我总是很惊讶,很少有人用mysqli启用例外。我想他们只是没有注意到文档中有关mysqli_report()的部分。它真的很隐蔽。

对于使用PDO启用异常的开发人员来说,这似乎更为常见。默认情况下,此功能也未启用,但在文档中更容易找到:http://php.net/manual/en/pdo.error-handling.php

相关问题