1

为用户开发一个非常简单的 UPDATE 查询页面来更改他们的帐户密码,但是在建立 MySQLi 连接时遇到了一些障碍(或者看起来如此)。我是这行编程的新手,这是我第一次尝试执行动态查询,所以希望你们中的一个人可以很容易地发现它,并且您愿意提供一些急需的明智的建议。

这是有问题的页面:http: //www.parochialathleticleague.org/accounts.html

执行表单的 PHP 脚本后,我起初只收到一个空白屏幕。我浏览了我的代码,并尽我所能诊断问题。最终在 require 命令中添加了“OR die”函数后,我现在收到了这条消息:

警告:require(1) [function.require]: failed to open stream: No such file or directory > in /home/pal/public_html/accounts.php on line 10

致命错误:require() [function.require]:在第 10 行的 /home/pal/public_html/accounts.php 中无法打开所需的 '1' (include_path='.:/usr/local/php52/pear')

我很困惑。这是脚本代码:

<?php

// Show errors:
ini_set('display_errors', 1);

// Adjust error reporting:
error_reporting(E_ALL);

// Connect to the database:
require ('../mysqli_connect.php') OR die('Error : ' . mysql_error());

// Validate the school:
if (empty($_POST['school'])) {
    echo "You forgot to enter your school.<br>";
    $validate = 'false';
} else {
    $school = mysqli_real_escape_string($db, trim($_POST['school']));
    $validate = 'true';
}

// Validate the existing password:
if (empty($_POST['pass'])) {
    echo "You forgot to enter your existing password.<br>";
    $validate = 'false';
} else {
    $pass = mysqli_real_escape_string($db, trim($_POST['pass']));
    $validate = 'true';
}

// Validate the new password:
if (empty($_POST['new_pass'])) {
    echo "You forgot to enter your new password.<br>";
    $validate = 'false';
} elseif (empty($_POST['confirm_pass'])) {
    echo "You forgot to confirm your new password.<br>";
    $validate = 'false';
} elseif ($_POST['new_pass'] != $_POST['confirm_pass']) {
    echo "Sorry, your new password was typed incorrectly.<br>";
    $validate = 'false';
} else {
    $new_pass = mysqli_real_escape_string($db, trim($_POST['new_pass']));
    $validate = 'true';
}

// If all conditions are met, process the form:
if ($validate != 'false') {

    // Validate the school/password combination from the database:
    $q = "SELECT school_id FROM user_schools WHERE (school_name='$school' AND pass=SHA1('$pass') )";
    $r = @mysqli_query($db, $q);
    $num = @mysqli_num_rows($r);
    if ($num == 1) {

        // Get the school_id:
        $row = mysqli_fetch_array($r, MYSQLI_NUM);

        // Perform an UPDATE query to modify the password:
        $q = "UPDATE user_schools SET pass=SHA1('$new_pass') WHERE school_id=$row[0]";
        $r = @mysqli_query($db, $q);

        if (mysqli_affected_rows($db) == 1) {
            header("Location: confirm_accounts.html");
        } else {
            echo "Your password could not be changed due to a system error. Apologies for the inconvenience. If this problem continues, please contact us directly.";
        }

    }

}

mysqli_close($db);
exit();

?>

最后,这是它需要的连接脚本中的代码(当然,省略了帐户值):

<?php

// Set the database access information as constants:
DEFINE ('DB_USER', '***');
DEFINE ('DB_PASSWORD', '***');
DEFINE ('DB_HOST', 'localhost');
DEFINE ('DB_NAME', '***');

// Make the connection:
$db = @mysqli_connect (DB_HOST, DB_USER, DB_PASSWORD, DB_NAME) OR die ('Could not connect to MySQL: ' .mysqli_connect_error() );

// Set the encoding:
mysqli_set_charset($db, 'utf8');

在过去的几个小时里,我一直在尝试自己解决这个问题。谷歌无法解决。在这里翻阅档案无法解决。

这是我确实知道的:

  • 它需要的脚本 mysqli_connect.php 可以独立运行。我已经对其进行了广泛的测试,以确保所有登录信息都是正确的。
  • 该脚本也肯定在我请求它的父目录中。我已经尝试将它移动到公共目录并从那里调用它。相同的错误信息。尝试输入整个文件路径。相同的消息。
  • 此外,大多数脚本本身就可以正常工作。当我省略所有 MySQL 行并只留下基本验证代码时,它运行没有问题,并按要求将我发送到确认页面。建立连接似乎肯定有问题。

不知道从这里去哪里。任何帮助将不胜感激!提前谢谢了。

编辑:@YourCommonSense - 这是修改后的脚本,根据您的建议。仍然得到空白屏幕。我是否错误地遵循了您的建议?

<?php

// Show errors:
ini_set('display_errors', 1);

// Adjust error reporting:
error_reporting(E_ALL);

// Connect to the database:
require ('../mysqli_connect.php');

// Validate the school:
if (empty($_POST['school'])) {
    echo "You forgot to enter your school.<br>";
    $validate = 'false';
} else {
    $school = mysqli_real_escape_string($db, trim($_POST['school']));
    $validate = 'true';
}

// Validate the existing password:
if (empty($_POST['pass'])) {
    echo "You forgot to enter your existing password.<br>";
    $validate = 'false';
} else {
    $pass = mysqli_real_escape_string($db, trim($_POST['pass']));
    $validate = 'true';
}

// Validate the new password:
if (empty($_POST['new_pass'])) {
    echo "You forgot to enter your new password.<br>";
    $validate = 'false';
} elseif (empty($_POST['confirm_pass'])) {
    echo "You forgot to confirm your new password.<br>";
    $validate = 'false';
} elseif ($_POST['new_pass'] != $_POST['confirm_pass']) {
    echo "Sorry, your new password was typed incorrectly.<br>";
    $validate = 'false';
} else {
    $new_pass = mysqli_real_escape_string($db, trim($_POST['new_pass']));
    $validate = 'true';
}

// If all conditions are met, process the form:
if ($validate != 'false') {

    // Validate the school/password combination from the database:
    $q = "SELECT school_id FROM user_schools WHERE (school_name='$school' AND pass=SHA1('$pass') )";
    $r = mysqli_query($db, $q);
    if (!$r) {
    throw new Exception($mysqli->error." [$query]");
    }
    $num = mysqli_num_rows($r);
    if ($num == 1) {

        // Get the school_id:
        $row = mysqli_fetch_array($r, MYSQLI_NUM);

        // Perform an UPDATE query to modify the password:
        $q = "UPDATE user_schools SET pass=SHA1('$new_pass') WHERE school_id=$row[0]";
        $r = mysqli_query($db, $q);
        if (!$r) {
        throw new Exception($mysqli->error." [$query]");
        }

        if (mysqli_affected_rows($db) == 1) {
            header("Location: confirm_accounts.html");
        } else {
            echo "Your password could not be changed due to a system error. Apologies for the inconvenience. If this problem continues, please contact us directly.";
        }

    }

}

mysqli_close($db);
exit();

?>
4

1 回答 1

2

您的代码和“解决方案”的两个最大问题:

  1. 您到处都有@操作员。你对你的问题有-1票。@运营商本身就是邪恶的。IT 负责您看到的空白页。
  2. 但是,您选择的补救措施使事情变得更糟。这个“或死”的东西并不是解决任何错误报告问题的魔术。并且使用不当会导致像您遇到的错误。1在错误消息中的内容。

首先,你的包含是好的,所以,别管它。

从 mysqli 获取错误时,请按照以下说明进行操作:

而不是随机添加“或死亡”,您需要更强大和有用的错误报告解决方案。

如果您在整个应用程序代码中使用 mysqli_query() 而不将其封装到某个帮助程序类中,trigger_error()这是引发 PHP 错误的好方法,因为它还会告诉您发生错误的文件和行号

$res = mysqli_query($mysqli,$query) or trigger_error(mysqli_error($mysqli)."[$query]");

在您的所有脚本中
,从那时起您将被告知原因,为什么没有创建对象。(如果你对这种or语法感到好奇,我已经在这里解释过了——它也解释了为什么你会(1)在错误消息中出现)

但是,如果您将查询封装到某个类中,则触发器错误中的文件和行将毫无用处,因为它们将指向调用本身,而不是导致某些问题的应用程序代码。所以,在运行封装的mysqli命令时,必须使用另一种方式:

$result = $mysqli->query($sql);
if (!$result) {
    throw new Exception($mysqli->error." [$query]");
}

as Exception 将为您提供堆栈跟踪,它将引导您找到调用错误查询的位置。

请注意,您必须能够看到一般的 PHP 错误。在实时站点上,您必须查看错误日志,因此,设置必须是

error_reporting(E_ALL);
ini_set('display_errors',0);
ini_set('log_errors',1);

在本地开发服务器上,可以在屏幕上出错:

error_reporting(E_ALL);
ini_set('display_errors',1);

当然,您永远不应该在语句前使用错误抑制运算符 (@)。

于 2013-08-25T08:35:58.250 回答