为用户开发一个非常简单的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‘)
我很困惑。以下是脚本代码:
<?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');在过去的几个小时里,我一直试图自己解决这个问题。谷歌无法解决这个问题。在这里翻阅档案无法解决这个问题。
我确实知道的是:
不知道从这里往哪里走。如能提供任何帮助,将不胜感激!在此之前,非常感谢您。
编辑:@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();
?>发布于 2013-08-25 08:35:58
代码和“解决方案”有两个最大的问题:
@接线员。你对你的问题投了一票。@算子本身就是邪恶的。它负责您看到的空白页。1。首先,你的包括是好的,所以,别管它了。
要从mysqli获得一个错误,请遵循以下说明:
而不是随机添加“或死”,您需要更健壮和有帮助的错误报告解决方案。
如果您在整个应用程序代码中都使用mysqli_query()而没有将其封装到某个助手类中,则trigger_error()是引发PHP的一个好方法,因为它还会告诉您发生错误的文件和行号。
$res = mysqli_query($mysqli,$query) or trigger_error(mysqli_error($mysqli)."[$query]");在你所有的剧本里
从那时起,您将被告知为什么没有创建对象。(如果您对这个or语法感到好奇,I've explained it here -这也解释了为什么您在错误消息中有(1) )
但是,如果您将查询封装到某个类、文件和行中以避免触发错误,那么它们将指向调用本身,而不是导致某些问题的应用程序代码,这将是非常无用的。因此,在封装mysqli命令时,必须使用另一种方法:
$result = $mysqli->query($sql);
if (!$result) {
throw new Exception($mysqli->error." [$query]");
}异常将为您提供一个堆栈跟踪,这将引导您找到调用错误查询的位置。
请注意,通常您必须能够看到PHP错误。在活动站点上,您必须查看错误日志,因此,设置必须是
error_reporting(E_ALL);
ini_set('display_errors',0);
ini_set('log_errors',1);在本地开发服务器上,在屏幕上出错是可以的:
error_reporting(E_ALL);
ini_set('display_errors',1);当然,您永远不应该在语句前面使用错误抑制操作符(@)。
https://stackoverflow.com/questions/18427070
复制相似问题