PHP不会将HTML代码保存到数据库中


PHP does not save HTML code to database

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_,并且没有对问题进行任何更改

设置.pp

<?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);
        }
?>

可能的问题

php已经由您的服务器更新,这通常会导致嵌套功能随着大步骤升级而中断。我发现strip_tags()去年就发生了这种情况。

正如周在评论中所说,做一些标准的PHP错误检查,阅读错误日志文件。PHP有一个出色的错误输出系统,向您展示错误所在,即使没有向您展示如何修复。

给服务器主机发电子邮件,明确询问他们是否对系统进行了更新和更改,其中包括对php.ini文件的更新,这可能会影响很多更改。他们应该在更新内容时总是通知您,但有时不会。

我发现很难看出,如果这仍然是一个过时五年的代码(MySQL),那么对于有能力的程序员来说,这是一个广泛的基于互联网的问题。

整个magic quotes是一个长期被弃用的东西,可能实际上已经删除了功能(?)。魔术名言是一个非常糟糕的练习,所以我认为它在PHP5中被删除了。带着极端的偏见避免它。

不要对在这里试图帮助你的人生气。请我知道,我真的知道当事情不起作用时会很沮丧,但当他们只能提供你提供的信息时,告诉那些抽出时间建议和帮助你的人"动脑筋"是粗鲁的,不会鼓励其他人帮助你。

因此,解决您问题的途径:

1) 阅读周关于设置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全局变量,但它们确实很旧,也不推荐使用,因为你说你有PHP 5.4,这些全局变量是无用的,不能使用。

是什么让你把$GLOBALS放进MySQL?这些变量出现在哪里?为什么它们的语法如此糟糕。这些对你的事业没有帮助。

改进版本:

请注意:所有引用魔术引号的函数都不需要,应该删除。我使用了settings.php中的数据来设置$dbLink,这是MySQLi所需的数据库链接。

我还将错误日志设置为显示在您的"tmp/php-error.log"中,这将NOT在您的web目录中,但将在您的网络目录下,并可通过FTP访问。我无法设置一个更好的位置,因为我不知道你主持的结构,但可以随意编辑。

您在哪里知道您的settings.php mysql_connect不是MySQLi?下面的代码应该运行,并且应该向您提供任何错误输出,包括指定文件的通知和警告。上传这个并查看它是如何运行的。

同样,在您的原始代码中,HTML内容的底部也有一些require和jazz,对于这次调试,您不需要这些。

我强烈建议不要使用自动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)