PHP 5.4(由我的主持人推荐) MySQL 5 我没有日志。
我有一个脚本在一周前工作得非常好。我对它做了绝对的 ZERO 更改。它是一个简单的新闻系统脚本。
用于允许使用粗体,斜体,下划线等html文本进行保存。编辑新闻时,它将以与保存时相同的方式显示。唯一改变的是。它将在保存到数据库之前添加,但在显示时将被删除。
这是保存信息的脚本部分。我拿出了对问题无效的任何信息。仅显示包含问题的内容。
<?php require('check.php');
require_once('settings.php');
if (isset($_POST['update'])) {
$id = htmlspecialchars(strip_tags($_POST['id']));
$month = htmlspecialchars(strip_tags($_POST['month']));
$date = htmlspecialchars(strip_tags($_POST['date']));
$year = htmlspecialchars(strip_tags($_POST['year']));
$time = htmlspecialchars(strip_tags($_POST['time']));
$entry = $_POST['entry'];
$avatar = $_POST['avatar'];
$title = htmlspecialchars(strip_tags($_POST['title']));
/* $entry = nl2br($entry); */
$entry = preg_replace("/\r\n|\r/", "<br />", $entry);
if (!get_magic_quotes_gpc()) {
$title = addslashes($title);
$entry = addslashes($entry);
}
$timestamp = strtotime ($month . " " . $date . " " . $year . " " . $time);
$result = mysqli_query($GLOBALS["___mysqli_ston"], "UPDATE my_blog SET timestamp='$timestamp', title='$title', entry='$entry', avatar='$avatar' WHERE id='$id' LIMIT 1") or print ("Can't update entry.<br />" . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)));
header("Location: ../entry.php?id=" . $id);
}
if (isset($_POST['delete'])) {
$id = (int)$_POST['id'];
$result = mysqli_query($GLOBALS["___mysqli_ston"], "DELETE FROM my_blog WHERE id='$id'") or print ("<p class=\"error\"Can't delete entry.<br />" . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . "</p>");
if ($result != false) {
print "<p class=\"success\">The entry has been successfully deleted from the database.</p>";
exit;
}
}
if (!isset($_GET['id']) || empty($_GET['id']) || !is_numeric($_GET['id'])) {
die("Invalid entry ID.");
}
else {
$id = (int)$_GET['id'];
}
require_once("header.php");
$result = mysqli_query($GLOBALS["___mysqli_ston"], "SELECT * FROM my_blog WHERE id='$id'") or print ("Can't select entry.<br />" . $sql . "<br />" . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)));
while ($row = mysqli_fetch_array($result)) {
$old_timestamp = $row['timestamp'];
$old_title = stripslashes($row['title']);
$old_entry = nl2br($row['entry']);
$old_avatar = stripslashes($row['avatar']);
$old_password = $row['password'];
$old_title = str_replace('"','\'',$old_title);
$old_entry = str_replace('\r\n', '<br />', $old_entry);
$old_month = date("F",$old_timestamp);
$old_date = date("d",$old_timestamp);
$old_year = date("Y",$old_timestamp);
$old_time = date("H:i",$old_timestamp);
}
?>
<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
<p><input class="form-control" type="hidden" name="id" value="<?php echo $id; ?>" />
<b><label for="month">Date:</label></b>
<table width=100%>
<tr>
<td width="25%"><input class="form-control" type="text" name="date" id="date" size="2" value="<?php echo $old_date; ?>" /></td>
<td width="50%"><select class="form-control" name="month" id="month">
<option value="<?php echo $old_month; ?>"><?php echo $old_month; ?></option>
<option value="January">January</option>
<option value="February">February</option>
<option value="March">March</option>
<option value="April">April</option>
<option value="May">May</option>
<option value="June">June</option>
<option value="July">July</option>
<option value="August">August</option>
<option value="September">September</option>
<option value="October">October</option>
<option value="November">November</option>
<option value="December">December</option>
</select></td>
<td width="25%"><select class="form-control" name="year" id="year">
<option value="<?php echo $old_year; ?>"><?php echo $old_year; ?></option>
<option value="2013">2013</option>
<option value="2014">2014</option>
<option value="2015">2015</option>
<option value="2016">2016</option>
<option value="2017">2017</option>
<option value="2018">2018</option>
<option value="2019">2019</option>
<option value="2020">2020</option>
</select></td>
</tr>
<tr>
<td><b><label for="time">Time:</label></b></td>
<td><b><label for="title">Title:</label></b></td>
<td><b><label for="avatar">Icon:</label></b></td>
</tr>
<tr>
<td><input class="form-control" type="text" name="time" id="time" size="5" value="<?php echo $old_time; ?>" /></td>
<td><input class="form-control" type="text" name="title" id="title" value="<?php echo $old_title; ?>" size="40" /></td>
<td><input class="form-control" type="text" name="avatar" id="avatar" size="40" maxlength="100" value="<?php echo $old_avatar; ?>" /></td>
</tr>
</table>
<p><textarea class="form-control" cols="80" rows="20" name="entry" id="entry"><?php echo $old_entry; ?></textarea></p>
<p><button type="submit" name="update" id="update" class="btn btn-default">Update!</button></p>
</form>
<p><strong>Before deleting, be absolutely sure - there is no confirmation nor is there any way to reverse deletion!</strong><br />
<small>(You may be shown your entry again after deleting - do not worry, it HAS been deleted. Check the main page of the blog if you are still unsure.</small></p>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
<input type="hidden" name="id" id="id" value="<?php echo $id; ?>" />
<button type="submit" name="delete" id="delete" class="btn btn-default">Yes, I am absolutely and positively sure I want to delete this entry.</button>
</form>
<?php
require_once("footer.php");
((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
?>
我已经尝试过查看这是否是一个主机问题,但显然许多使用此特定脚本的主机上的人都遇到了这个问题。这一切都是在每个人的同一时间开始的。但没有一个人知道发生了什么。每个人至少在PHP 5.4上都没有运行。
真正奇怪的是,某些工作停止了工作,并且正在寻找可能是什么问题的一些见解。谷歌一直没有帮助,我在堆栈溢出时无法找到任何东西。
请注意我已尝试更改保存信息的方式。我知道使用nl2br()实际上不应该用于将信息保存到数据库,只显示来自数据库的信息。但我没有编写脚本,并且不再由脚本的原始开发人员保存。
我已将所有内容转换为mysqli_而不更改问题。
的settings.php
<?php
$users = array($user => md5($pass));
$salt = substr(md5(date("F")), 8);
$cards_seperate_directory = FALSE;
$connect = mysql_connect("$db_server", "$db_user", "$db_password")
or die( DATABASE_CONNECT_ERROR . mysql_error() );
mysql_select_db("$db_database", $connect)
or die( DATABASE_CONNECT_ERROR . mysql_error() );
function CleanUp($data) {
$data = trim(htmlentities(strip_tags($data)));
return $data;
}
function escape_sql($sql) {
if (get_magic_quotes_gpc()) $sql = stripslashes($sql);
return mysql_real_escape_string($sql);
}
?>
答案 0 :(得分:1)
php已由您的服务器更新,这通常会导致嵌套功能因大步升级而中断。我发现,strip_tags()
去年发生了这件事。
正如Jay在评论中所述,做一些标准的PHP错误检查,读取你的错误日志文件。 PHP有一个出色的错误输出系统,会显示错误,即使没有告诉你如何修复它。
通过电子邮件发送服务器主机,并明确地询问他们是否对系统进行了更新和更改,其中包括更新php.ini
文件等可能会导致大量更改的内容。他们应在更新内容时始终通知您,但有时他们不会。
我发现很难看出这是一个广泛的基于互联网的问题,如果它仍然是五年过时的代码(MySQL),那么有能力的程序员。
整个magic quotes
是长期弃用的东西,可能实际上是删除了功能(?)。魔术引用是一种非常糟糕的练习,所以我认为它在PHP5中被删除了。避免它带有极端的偏见。
不要对那些想帮助你的人生气。请。我知道,我真的知道当事情不起作用时令人沮丧,但告诉那些正在抽出时间建议并帮助你“使用你的大脑”的人 他们只能继续获取尽可能多的信息如您提供 是粗鲁的,不会鼓励他人帮助您。
所以,解决问题的路线:
1)阅读Jay的评论,说明如何设置PHP错误报告,然后重新运行脚本,然后确定正在生成错误日志(有故意的错误),然后下载日志并阅读它,它会给你一个对问题所在的宝贵见解。
2)更新到MySQLi。尽快做到这一点。它不会影响/破坏脚本的工作,但会更好地改进它们。
3)与您的服务器主机取得联系,并获得有关内容更新的具体说明
4)检查历史GIT或类似存储库中的所有文件,因为您的代码编写得非常糟糕,并且我确定您会有很多安全漏洞,因此可能存在一些恶意软件或黑客攻击(可能)让你妥协。
5)抓住你的舌头,不要咬那些需要时间来帮助你的人。 6)反馈,用新信息更新你的问题:你运行的是什么版本的PHP,你运行的是什么版本的MySQL,你的错误日志是什么意思?您是否阅读了http://php.net/manual/en/function.nl2br.php可能出现的问题,包括评论中的内容?7)我们可以为您提供更好,更有帮助的解决方案
$result = mysqli_query($GLOBALS["___mysqli_ston"], "UPDATE my_blog SET timestamp='$timestamp', title='$title', entry='$entry', avatar='$avatar' WHERE id='$id' LIMIT 1") or print ("Can't update entry.<br />" . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)));
这一行有一堆看起来很糟糕的PHP Globals,但这些都很旧并且已经弃用了,你说你用的是5.4,这些全局变量是无用的,不能被使用。
是什么让你将$GLOBALS
放入MySQL?这些变量出现在哪里?为什么它们用如此糟糕的语法编写。这些对你的事业没有帮助。
答案 1 :(得分:0)
请注意:所有引用魔术引号的函数确实不需要,应该删除。我使用settings.php中的数据来设置$dbLink
,这是MySQLi所需的数据库链接。
我还将错误记录设置为显示在“tmp / php-error.log”中,这将 NOT 位于您的网络目录中,但将位于您的网络目录下方并可通过FTP访问。我无法设置更好的位置,因为我不知道您的托管结构,但随时可以编辑。
你知道你的settings.php mysql_connect不是MySQLi吗? 下面的代码应该运行,并且应该为您提供任何错误输出,包括指定文件的通知和警告。上传它,看看它是如何运行的。
在原始代码上也没有那个,在HTML内容的底部有一些要求和爵士乐,你不需要这个,用于这个调试。
我强烈建议不要使用自动MySQLi转换器。
让我知道这是怎么回事......
require('check.php');
//require_once('settings.php');
$users = array($user => md5($pass));
$salt = substr(md5(date("F")), 8);
$cards_seperate_directory = FALSE;
$dbLink = mysqli_connect($db_server, $db_user, $db_password, $db_database);
error_reporting(E_ALL);
ini_set("error_log", "/tmp/php-error.log");
ini_set('display_errors', 1);
if (isset($_POST['update'])) {
$id = strip_tags($_POST['id']);
$id = htmlspecialchars($id);
$month = strip_tags($_POST['month']);
$month = htmlspecialchars($month);
$date = strip_tags($_POST['date']);
$date = htmlspecialchars($date);
$year = strip_tags($_POST['year']);
$year = htmlspecialchars($year);
$time = strip_tags($_POST['time']);
$time = htmlspecialchars($time);
$avatar = $_POST['avatar'];
$title = strip_tags($_POST['title']);
$title = htmlspecialchars($title);
$entry = $_POST['entry'];
/* $entry = nl2br($entry); */
$entry = preg_replace("/\r\n|\r/", "<br />", $entry);
$timestamp = strtotime ($month . " " . $date . " " . $year . " " . $time);
$result = mysqli_query( $dbLink, "UPDATE my_blog SET timestamp='$timestamp', title='$title', entry='$entry',
avatar='$avatar' WHERE id='$id' LIMIT 1") or die(mysqli_error($dbLink));
header("Location: ../entry.php?id=" . $id);
die();
}
if (isset($_POST['delete'])) {
$id = (int)$_POST['id']; //assumes the ID is an int.
if ($id > 0 ) {
$result = mysqli_query($dbLink, "DELETE FROM my_blog WHERE id='$id' LIMIT 1 ") or die(mysqli_error($dbLink));
if ($result !== false) {
print "<p class='success'>The entry has been successfully deleted from the database.</p>";
die();
}
}
}
if (!isset($_GET['id']) || empty($_GET['id']) || !is_numeric($_GET['id'])) {
die("Invalid entry ID.");
}
else {
$id = (int)$_GET['id'];
}
require_once("header.php");
$result = mysqli_query($dbLink, "SELECT * FROM my_blog WHERE id='$id' LIMIT 1") or die(mysqli_error($dbLink));
while ($row = mysqli_fetch_array($result)) {
$old_timestamp = $row['timestamp'];
$old_title = stripslashes($row['title']);
$old_entry = nl2br($row['entry']);
$old_avatar = stripslashes($row['avatar']);
$old_password = $row['password'];
$old_title = str_replace('"','\'',$old_title);
$old_entry = str_replace('\r\n', '<br />', $old_entry);
$old_month = date("F",$old_timestamp);
$old_date = date("d",$old_timestamp);
$old_year = date("Y",$old_timestamp);
$old_time = date("H:i",$old_timestamp);
}
?>
(rest of file)