首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mysqli_connect致命错误: require()

mysqli_connect致命错误: require()
EN

Stack Overflow用户
提问于 2013-08-25 08:27:23
回答 1查看 667关注 0票数 1

为用户开发一个非常简单的UPDATE查询页面来更改他们的帐户密码,但是在建立MySQLi连接时遇到了一点麻烦(至少看起来是这样)。我对这一行编程很陌生,这是我第一次尝试执行动态查询,所以希望这是你们中的一个人能够很容易发现的东西,并且你们会很好地提供一些急需的sage建议。

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

在执行表单的PHP脚本时,我最初只收到一个空白的白屏幕。我仔细研究了我的代码,并做了我能想到的一切来诊断问题。在最终向require命令中添加"OR die“函数后,我现在收到以下消息:

警告:需要(1) function.require:未能打开流:在第10行的/home/pal/public_html/accounts.php中没有这样的文件或目录> 致命错误: function.require:失败的打开要求第10行中的/home/pal/public_html/accounts.php中的'1‘(包含_path=’.:/usr/local/php52 52/pear‘)

我很困惑。以下是脚本代码:

代码语言:javascript
复制
<?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();

?>

最后,下面是它所需要的连接脚本中的代码(当然还有省略的帐户值):

代码语言:javascript
复制
<?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 -这是根据您的建议修改的脚本。还能看到空白屏幕。我是不是听错了你的建议?

代码语言:javascript
复制
<?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();

?>
EN

回答 1

Stack Overflow用户

发布于 2013-08-25 08:35:58

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

  1. 这里到处都是@接线员。你对你的问题投了一票。@算子本身就是邪恶的。它负责您看到的空白页。
  2. 然而,你所选择的疗法使事情变得更糟了。这种“或死”不是解决任何错误报告问题的神奇口号。如果使用不当,将导致错误(),就像您的错误一样。错误消息中有1

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

要从mysqli获得一个错误,请遵循以下说明:

而不是随机添加“或死”,您需要更健壮和有帮助的错误报告解决方案。

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

代码语言:javascript
复制
$res = mysqli_query($mysqli,$query) or trigger_error(mysqli_error($mysqli)."[$query]");

在你所有的剧本里

从那时起,您将被告知为什么没有创建对象。(如果您对这个or语法感到好奇,I've explained it here -这也解释了为什么您在错误消息中有(1) )

但是,如果您将查询封装到某个类、文件和行中以避免触发错误,那么它们将指向调用本身,而不是导致某些问题的应用程序代码,这将是非常无用的。因此,在封装mysqli命令时,必须使用另一种方法:

代码语言:javascript
复制
$result = $mysqli->query($sql);
if (!$result) {
    throw new Exception($mysqli->error." [$query]");
}

异常将为您提供一个堆栈跟踪,这将引导您找到调用错误查询的位置。

请注意,通常您必须能够看到PHP错误。在活动站点上,您必须查看错误日志,因此,设置必须是

代码语言:javascript
复制
error_reporting(E_ALL);
ini_set('display_errors',0);
ini_set('log_errors',1);

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

代码语言:javascript
复制
error_reporting(E_ALL);
ini_set('display_errors',1);

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18427070

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档