Php Can';t通过&;以美元计

Php Can';t通过&;以美元计,php,mysql,Php,Mysql,我提供了一个非常简单的测试数据集和我的代码来尝试解决这个问题。如果之前有人问过这个问题,我就找不到了。我自学成才,从书本和网络上学习,所以这不是一个圆滑的编程。我希望我提供了足够的信息 数据集由一个表“comments”组成,其中包含字段id(自动增量)、名称(文本)、注释(textarea)、日期、显示(枚举) mysql连接排序规则以及所有文本和文本区域字段都设置为utf8\u general\u ci The <head> includes <meta http-equ

我提供了一个非常简单的测试数据集和我的代码来尝试解决这个问题。如果之前有人问过这个问题,我就找不到了。我自学成才,从书本和网络上学习,所以这不是一个圆滑的编程。我希望我提供了足够的信息

数据集由一个表“comments”组成,其中包含字段id(自动增量)、名称(文本)、注释(textarea)、日期、显示(枚举) mysql连接排序规则以及所有文本和文本区域字段都设置为utf8\u general\u ci

The <head> includes 
<meta http-equiv="Content-Type" content="text/html" charset="UTF-8" /> 
我的代码成功地将有问题的字符输入到数据库中,如果我只想显示这些字符,就可以成功地检索它们,但是在现实世界中,我需要检查用户条目,以确保它们适合公众查看,并且我还需要能够编辑它们。当我打开我的评论编辑页面时,字段中的&之后的任何内容都会消失,如果任何字段中有#或“则不会检索到任何内容

首先是comments-admin.php页面:

   <?php
    $dbc = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME)
    or die('Error connecting to MySQL server.');
    ?>
        <table width="100%"><tr><td>
        <b>ID:</b></td><td>
        <b>Name:</b></td><td align="left">
        <b>Comments:</b></td><td>
        <b>Date Posted:</b></td><td>
        <b>Display:</b></td></tr><tr><td>
    <?php
        $query = "SELECT * FROM comments ORDER BY date DESC";
        $result = mysqli_query($dbc,$query);
        while ($row=mysqli_fetch_array($result)){
        echo '<tr valign="top" ><td>';
        echo  $row['id'] . '</td><td>';
        echo  $row['name'] . '</td><td>'; 
        echo  $row['comments'] . '</td><td>'; 
        echo  $row['date'] . '</td><td>'; 
        echo  $row['display'] . '</td><td>'; 
        echo  '<td><a href="comments-edit.php?id=' . $row['id'] . 
              '&amp;name=' . $row['name'] . 
              '&amp;comments=' . $row['comments'] . 
              '&amp;date=' . $row['date'] . 
              '&amp;display=' . $row['display'] . 
              '">Edit</a></td></tr>';
          }
          ?>
          </table>
“编辑打开my comments-Edit.php表单。在本例中,唯一能正确打开的是#9.#'s11和s12根本不会检索任何内容,并且#4在&之后也不会有任何内容

编辑注释的代码如下:

<?php
$dbc = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME)
  or die('Error connecting to MySQL server.');

 if (isset($_GET['id']) &&
   isset($_GET['name']) && 
   isset($_GET['comments']) && 
   isset($_GET['date'])) 
{

// Grab the data from the GET
    $id = ( $_GET['id']);
    $name =  mysqli_real_escape_string($dbc, $_GET['name']);
    $comments =  mysqli_real_escape_string($dbc, $_GET['comments']);
    $date =  ( $_GET['date']);
}
else if (isset($_POST['id']) && 
    isset($_POST['name']) && 
    isset($_POST['comments']) && 
    isset($_POST['date']) && 
    isset($_POST['display']))  
{
// Grab the data from the POST
    $id =  ( $_POST['id']);
    $name =  mysqli_real_escape_string($dbc, $_POST['name']);
    $comments =  mysqli_real_escape_string($dbc, $_POST['comments']);
    $date =  ( $_POST['date']);
    $display =  ( $_POST['display']);
    }

   <form class="gap" method="post" action="comments-update.php">
  <input type="hidden" name="ud_id" value="<?php echo "$id;" ?>" />
<p class="gap"><b>Select "Yes" before clicking "Edit Data" to confirm any changes</b></p>
<input type="radio" name="confirm" value="Yes" /> Yes 
<input type="radio" name="confirm" value="No" checked="checked" /> No 
<input type="submit" value="Edit Data" name="update" /><br />   

<label class="appsm">Comment Date:</label>
<input type="text" size="30" name="ud_date" value="<?php echo $date; ?>" 

<label class="appsm">ID:</label>
<input type="text" size="5" name="ud_id" value="<?php echo $id; ?>" />

<label class="appsm">Display:</label>
      <select id="ud_display" name="ud_display">
        <option value="yes" <?php if (!empty($display) && $display == 'yes') echo 'selected = "selected"'; ?>>Yes</option>
        <option value="no" <?php if (!empty($display) && $display == 'no') echo 'selected = "selected"'; ?>>No</option>
      </select><br />

<label class="appsm">Name:</label>
<input type="text" size="50" name="ud_name" value="<?php echo $name; ?>" />
<br />
<label class="appsm">comments:</label>
<textarea name="ud_comments" wrap="physical" class="left" cols="105" rows="2">
<?php echo stripslashes($comments); ?></textarea>

</form>
>是

我肯定我错过了一些非常简单的东西,我也搜索了我的书和网络,但我没有找到这个具体问题的答案。我真的希望能够从我的真实网站中删除所有不使用这些字符的警告,特别是因为用户很少阅读说明。

如上面的评论所述,您需要对URL中传递的内容进行编码

但我的问题是,当你可以从数据库中获取信息时,为什么你要将所有信息传递到第二个页面?还将代码更改为使用a,而不是所有那些
echo()
语句。这是一种使代码更具可读性的简便方法。最后,将数据输出到HTML需要使用转义。我过去常常很快逃离整个数据库记录

<?php
$dbc = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME) or die('Error connecting to MySQL server.');
?>
    <table width="100%"><tr><td>
    <b>ID:</b></td><td>
    <b>Name:</b></td><td align="left">
    <b>Comments:</b></td><td>
    <b>Date Posted:</b></td><td>
    <b>Display:</b></td></tr><tr><td>
<?php
    $query = "SELECT * FROM comments ORDER BY date DESC";
    $result = mysqli_query($dbc,$query);
    while ($row=mysqli_fetch_array($result)){
        $row = array_map('htmlspecialchars', $row);
        echo <<< HTML
<tr valign="top">
    <td>$row[id]</td>
    <td>$row[name]</td>
    <td>$row[comments]</td>
    <td>$row[date]</td>
    <td>$row[display]</td> 
    <td><a href="comments-edit.php?id=$row[id]">Edit</a></td>
</tr>

HTML;
      }
      ?>
      </table>

身份证件:
姓名:
评论:
公布日期:
显示:
你的第二个文件。请注意$\u POST和$\u GET都被合并到超级全局$\u请求中,不过您应该真正了解自己的页面将如何发送数据。再次转义HTML输出

<?php
$dbc = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME) or die('Error connecting to MySQL server.');

if (isset($_REQUEST['id'])) {
    $id = (int)$_REQUEST['id'];
    $query = "SELECT * FROM comments WHERE id=$id";
    $result = mysqli_query($dbc,$query);
    $row=mysqli_fetch_array($result);
}
if (!isset($_REQUEST['id']) || !$row) {
    // you should do something in this case
    return false;
}
$id = htmlspecialchars($row['id']);
$name = htmlspecialchars($row['name']);
$comments = htmlspecialchars($row['comments']);
$date = htmlspecialchars($row['date']);
$display = htmlspecialchars($row['display']);
?>

<form class="gap" method="post" action="comments-update.php">
<input type="hidden" name="ud_id" value="<?php echo $id ?>" />
...


您需要对注释进行URL编码。注释中的
&
使其成为get请求中的新参数。您还应该研究XSS注入并防止它们。谢谢你,米肯。将信息传递到编辑页面的原因是几个不同的人管理网站的不同方面,他们没有直接访问数据库的权限。我想我误解了你的评论。我这样做是因为这是我使用的第一本书所做的,它适用于我和其他对这些东西了解比我少的用户。此外,我的真实表格有许多文本字段,这些字段更容易以新的形式处理。除了(int)$\u REQUEST['id']之外,还有其他东西可以使用字母数字主键吗?我尝试用varchar替换int,但只得到一条错误消息……否则我可以向这些表中添加一个整数主值。这是我的观点,数据库中的内容无关紧要。您可以传递记录ID,以便接收页面可以从数据库中取出它想要的任何内容。除非有很好的理由,否则不应该使用SERIAL类型的列作为记录ID。如果您需要传递一个非数字的记录ID,您需要进入准备好的语句和参数化查询。叹气!当时对我的人脑来说似乎是直觉的东西,但对一台在0和1中思考的机器来说却不是。我给了自己一点额外的工作,但最后这是一个简单的解决办法。你的帮助是无价的。再次感谢你
<?php
$dbc = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME) or die('Error connecting to MySQL server.');
?>
    <table width="100%"><tr><td>
    <b>ID:</b></td><td>
    <b>Name:</b></td><td align="left">
    <b>Comments:</b></td><td>
    <b>Date Posted:</b></td><td>
    <b>Display:</b></td></tr><tr><td>
<?php
    $query = "SELECT * FROM comments ORDER BY date DESC";
    $result = mysqli_query($dbc,$query);
    while ($row=mysqli_fetch_array($result)){
        $row = array_map('htmlspecialchars', $row);
        echo <<< HTML
<tr valign="top">
    <td>$row[id]</td>
    <td>$row[name]</td>
    <td>$row[comments]</td>
    <td>$row[date]</td>
    <td>$row[display]</td> 
    <td><a href="comments-edit.php?id=$row[id]">Edit</a></td>
</tr>

HTML;
      }
      ?>
      </table>
<?php
$dbc = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME) or die('Error connecting to MySQL server.');

if (isset($_REQUEST['id'])) {
    $id = (int)$_REQUEST['id'];
    $query = "SELECT * FROM comments WHERE id=$id";
    $result = mysqli_query($dbc,$query);
    $row=mysqli_fetch_array($result);
}
if (!isset($_REQUEST['id']) || !$row) {
    // you should do something in this case
    return false;
}
$id = htmlspecialchars($row['id']);
$name = htmlspecialchars($row['name']);
$comments = htmlspecialchars($row['comments']);
$date = htmlspecialchars($row['date']);
$display = htmlspecialchars($row['display']);
?>

<form class="gap" method="post" action="comments-update.php">
<input type="hidden" name="ud_id" value="<?php echo $id ?>" />
...