【问题标题】:PHP does not save HTML code to databasePHP 不会将 HTML 代码保存到数据库
【发布时间】:2015-05-04 08:20:15
【问题描述】:

PHP 5.4(我的主机推荐) MySQL 5 我没有日志。

我有一个一周前运行良好的脚本。我已经对其进行了绝对的更改。这是一个简单的新闻系统脚本。

它用于允许保存 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);
        }
?>

【问题讨论】:

  • 您能否发布更多代码以显示所有变量的设置位置?查看 $timestamp、$title、$avatar 和 $id 会很有用。
  • 1. HTML 不能将任何内容存储到数据库中,因为它是一种标记语言,而不是一种编程语言; 2. 如果没有人没有改变任何东西,它仍然可以工作——因此,一定有人改变了一些东西; 3. “不工作”并不是一个足够的问题描述来帮助你
  • 听起来 PHP 升级了,mysql_* 函数消失了。有什么错误吗?检查日志?在您打开 &lt;?php 标记 error_reporting(E_ALL); ini_set('display_errors', 1); 后立即在文件顶部添加错误报告
  • 使用mysql_real_escape_string 而不是addslashes
  • tips:查询前不要使用nl2br,实际需要html时使用。这样,您仍然可以在您的网站上公开非 html 版本。另外,请查看 mysqli,因为 mysql 已被贬低。

标签: php mysql


【解决方案1】:

可能的问题

php 已由您的服务器更新,这通常会导致嵌套功能因大步升级而中断。我发现strip_tags() 去年发生在我身上。

正如 Jay 在 cmets 中所说,做一些标准的 PHP 错误检查,阅读您的错误日志文件。 PHP 有一个出色的错误输出系统,告诉你哪里出了问题,即使没有告诉你如何修复它。

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

如果它的代码仍然过期五年(MySQL),我很难看出这是一个广泛的互联网问题,有能力的程序员。

整个magic quotes 早已被弃用并且可能实际上已删除功能(?)。魔术引号是一种非常糟糕的做法,所以我认为它在 PHP5 中被删除了。以极端的偏见避免它。

不要对试图在这里帮助你的人生气。请。我知道,我确实知道当事情不起作用时会令人沮丧,但是告诉正在抽出时间为您提供建议和帮助您“动脑筋”的人,他们只能继续提供尽可能多的信息你提供的内容是粗鲁的,不会鼓励其他人帮助你。

那么,解决您的问题的途径:

1) 从 Jay 那里阅读您的 cmets 关于设置 PHP 错误报告的说明,然后重新运行脚本,然后确定正在生成错误日志(有故意错误),然后下载日志并阅读它,它会给您一个对问题所在的宝贵见解。

2) 更新到 MySQLi。尽可能快地执行此操作。它不会影响/损坏脚本的工作,但会更好地改进它们。

3) 与您的服务器主机取得联系,并获得一些具体的说明,以了解更新的内容和内容

4) 从历史悠久的 GIT 或类似的存储库中检查您的所有文件,因为您的代码写得非常糟糕,而且我相信您会有很多安全漏洞,因此可能存在一些恶意软件或黑客攻击(可能) 损害了你。

5) 闭嘴,不要咬那些花时间帮助你的人。

6) 反馈,用新信息更新你的问题:你运行的是什么版本的 PHP,你运行的是什么版本的 MySQL,你的错误日志说什么?您是否阅读过http://php.net/manual/en/function.nl2br.php 中可能存在的问题,包括在 cmets 中的问题?

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 中?这些变量出现在哪里以及为什么它们的语法如此糟糕。这些对您的事业没有帮助。

【讨论】:

  • “MySQL 升级到 MySQLi”并不完全正确。数据库包被称为 MySQL 并且没有改变。不推荐使用的是 PHP 函数调用 mysql_query。像 mysqli 或 PDO 这样的现代界面是一个不错的选择。
  • 我的意思是,例如在我当前的服务器上,任何使用 Mysql_ 的 php 操作都会失败,但 Mysqli_ 可以工作,尽管我意识到我可能措辞不佳
  • 我只是想避免在 MySQL 数据库和 mysql_query PHP 函数之间产生混淆。有些人似乎认为他们是同一件事。同样值得注意的是,“魔术引号”是坏主意历史上最糟糕的主意之一,已从所有最新版本的 PHP 中永久删除。任何对此的代码测试都是高度可疑的。
  • 很公平。无论如何,我已经删除了该文本,因为 OP 声明他们已将所有内容更新到 MySQLi,我个人认为 PHP 错误日志将包含解决方案。 . . .
  • @VianelisMartinez 说你没有日志是不正确的。您确实有日志,但找不到它们。请阅读stackoverflow.com/questions/12834583/…,它是生成和输出 PHP 日志的指南。在你的问题 cmets 上也遵循 Jay 的建议,谢谢 :)
【解决方案2】:

改进版:

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

我还将错误日志设置为显示在您的“tmp/php-error.log”中,这将在您的 web 目录中,但将位于您的 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)

【讨论】:

  • 谢谢!实际上,在我将设置部分发布给您之后,我注意到它仍然在 mysql 而不是 mysqli 中。将上传并查看它的运行情况。
  • 只要您可以访问错误日志设置到的任何目录,这应该可以最好地指示问题所在
  • 问题的一部分已经解决。当信息显示在文本框中时,其显示正确。但它仍然缺少我的 html 标签。比如我的文字周围的。仍然找不到我的日志。我以前从来没有遇到过这个问题。我曾经使用 iPage 来托管我的网站,并且总是发现我的日志没有问题。我目前在 DreamHost 上,目录还是空的。
  • 如果您确定您位于正确的文件夹中 - 就像您的网站位于 [base]/home/www/ 中,那么 /tmp/ 文件夹位于 [base]/home/tmp/ 中。在这种情况下,请向您的托管服务提供商寻求帮助。还有 HTML 标签,它们是否出现在 MySQL 数据库中?它们是否出现在您的 HTML 文件的源代码中? &lt;&gt; 标签默认从 textareas 中删除。您需要检查您的$old_entry 实际值是否正确,然后通过htmlspecialchars() 函数运行$old_entry。同样不推荐使用&lt;b&gt;,请使用&lt;strong&gt;
  • 标签根本没有保存在 MySQL 数据库中。 (我同时使用 进行样式设置。我使用 strong 将重要的东西用红色加粗。而 仅用于样式。)我确实可以访问我的日志文件夹。那不是问题。 /home/tmp/ 文件夹存在。我能做到。但是里面根本没有文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
  • 2011-01-19
  • 2016-04-30
  • 2019-11-01
相关资源
最近更新 更多