未定义的索引错误 - 为什么这仍然适用于错误抑制?

时间:2013-07-26 15:07:57

标签: php mysql sql

我在下面的代码中有一个错误“注意:未定义的索引:srSend”。我有两个问题:

i)如果我进行错误抑制,为什么这段代码会起作用?未定义的索引是错误是否重要? ii)无论如何,我怎样才能纠正这个错误?

<?php

//db connection
$mysqli = new mysqli("localhost", "root", "", "test");
if ($mysqli->connect_errno) {
    echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
}


if($_POST['srSend'] && $_POST['srEmail']) {
    //check if email already taken
    if ($stmt = $mysqli->prepare("SELECT user_pin FROM users WHERE user_email = ?")) {
        $stmt->bind_param("s", strtolower($_POST['srEmail']));
        $stmt->execute();
        $stmt->bind_result($user_pin);
        $stmt->fetch();
        $stmt->close();
    }

5 个答案:

答案 0 :(得分:1)

当您压制错误时,您的代码仍然有效,因为它是“通知”。 PHP中存在不同级别的错误,您可以将PHP配置为仅显示某些类型的错误。以下是错误常量的完整列表:http://www.php.net/manual/fr/errorfunc.constants.php默认情况下,PHP中会禁用通知错误,因为您的代码仍然可以正常工作,但修复它们总是很好。

发生此通知是因为您尝试访问的索引不存在。您可以使用isset()来检查它们是否存在。

答案 1 :(得分:0)

要抑制此错误,您应检查是否已设置变量。事实上,这是一种最佳实践,因为如果变量为“假”或0则可能导致意外行为

if(isset($_POST['srSend']) && isset($_POST['srEmail'])) {

答案 2 :(得分:0)

这是通知

 Notice: Undefined index: srSend"

当PHP代码最初运行时$_POST['srSend']将不会被设置,因此您将收到此通知。如果条件为isset()

,您应该使用empty()if(isset($_POST['srSend']))查看

答案 3 :(得分:0)

  

i)错误有效,因为查询空白user_email字段是有效的,这是未定义索引时发生的情况。

     

ii)您可以通过检查isset或empty的$ _POST ['srEmail']是否存在来更正错误,如果不可用则提供默认值。

例如

// set email to blank if one not provided in the POST 
$email = isset($_POST["srEmail"])?isset($_POST["srEmail"]:"");  
  

iii)您应该能够回答为什么收到任何通知,因为它们可能表示代码中存在错误。即使通知的来源已知并且对您的应用程序没有损害,您应该在通知出现时处理通知,这样您就可以继续开发错误报告,而不会中断您的测试。

答案 4 :(得分:0)

运行时通知发生是因为脚本发现可能是错误的内容,但在正常运行脚本时也可能发生。 @运算符临时将该行的错误报告级别设置为0。如果该行触发错误,仍将调用错误处理程序,但将调用错误级别为0。

注意错误与任何其他严重错误一样重要。错误会降低你的应用程序的速度,你真的应该设计你的应用程序不要抛出错误,即使是小错误。在PHP愉快地继续执行脚本的情况下,许多其他语言将完全死亡。

在进一步移动之前,您需要检查变量是否已设置:

if(isset($_POST['srSend']) && isset($_POST['srEmail'])) {