当值具有单引号时,显示数据库中的不完整值

时间:2014-08-12 16:06:05

标签: php mysql forms

当我从数据库查询时,例如产品,"男士香蕉"它只显示" men"它削减了其余的文本。问题只发生在我在文本区域内查询时,但是当我直接从数据库查询它时,它会显示完整的文本。

使用textarea表单类型时,即使使用单引号也会显示它们。然而,当在这个表格中显示它时,它会削减其余部分。

echo "<td><label for='prod_price'>Product Name:</label></td>
      <td><input name='prod_name' id='prod_name' type='text' class='col1' value='$prodname'></td>
      </tr>";

我该怎么做才能解决这个问题。我想不出一个搜索谷歌的正确问题。所以我在这里解释

这是我的其余代码中删除了不必要的代码

<html>
    <head>
        <meta charset="utf-8" />
        <title>Edit a Product</title>
        <link rel="stylesheet" type="text/css" href="cms.css"/>
    <script type="text/javascript" src="jquery.js"></script>
    <script type="text/javascript" src="jquery.autocomplete.js"></script>
    <script>
     $(document).ready(function(){
      $("#prod_brand").autocomplete("prod_brand_auto_complete.php", {
            selectFirst: true
      });
     });
    </script>
    </head>
    <body>
  <style>
button {
  margin: 10px;
  padding: 10px;
}
a{
  color: black;
  text-decoration: none;
}

</style>


<?php
session_start();
  $conn = @mysql_connect("localhost","root","12148qx3er");
  $db = @mysql_select_db("buybranded");
$itemid = $_GET['id'];
$qry = "SELECT * FROM inventory where prod_id = ".$itemid;
mysql_set_charset("UTF8");
$result = @mysql_query($qry);
if($result === FALSE) {
    die(mysql_error()); // TODO: better error handling
}


echo "<div id='page-wrap'>
  <h1>Edit a Product</h1>";
while ($row=mysql_fetch_array($result)){

$prodbrand = $row['prod_brand'];
$prodname = $row['prod_name'];
$prodcategory = $row['prod_category'];
$prodprice = $row['prod_price'];
$prod_desc = $row['prod_desc'];
$prodpic = $row['prod_pic'];
$prodquantity = $row['prod_quantity'];

echo "<form enctype='multipart/form-data' method='post' action='updating_inv.php?id=$itemid'>";
echo "<table>
      <tr>";
echo "<td><label for='prod_brand'>Product Brand:</label></td>
      <td><input name='prod_brand' id='prod_brand' type='text' class='col1' placeholder='Auto Complete Form' value='$prodbrand'/></td>";

echo "<td><label for='prod_price'>Product Name:</label></td>
      <td><input name='prod_name' id='prod_name' type='text' class='col1' value='$prodname'></td>
      </tr>";
echo "<tr>";
echo "<td><label for='prod_price'>Product Price:</label></td>
      <td><input name='prod_price' id='prod_price' type='text' class='col1' value='$prodprice'/></td>";
  echo "<tr>";
  echo "<td><label for='prod_desc'>Description:</label></td>
        <td><textarea name='prod_desc' id='prod_desc' class='col2'>$prod_desc</textarea></td>";

  echo "<td></td><td><table><tr>";

  echo '<img src="data:image/jpeg;base64,' . base64_encode( $row['prod_pic'] ) . '" width="100" border="1px"/><br>';
  echo "<td><label for='prod_pic'>Upload Image:</label><br><input type='file' name='prod_pic' class='col2' value=''/></td>";
  echo "</tr>";
  echo "<tr>";
  echo "<td><label for='prod_quantity'>Quantity:</label><br><input name='prod_quantity' id='prod_quantity' type='text' class='col2' placeholder='ex. 10' value='$prodquantity'/></td>";
  echo "</tr>";
  echo "<tr>";
  echo "<td><form method='post'><button>Update this Entry!</button>";
  echo "<button><a href='inventory.php'>Go back</a></button></td>"; 
  echo "</tr></table></td></table>";

  echo "</form>";






  }
  echo "</div>";
?>

    </div>

    </body>
</html>

4 个答案:

答案 0 :(得分:1)

您应该考虑使用PHP的PDO类(预备语句)。 PDO类自动处理查询的特殊字符:http://php.net/manual/it/book.pdo.php

您可能会收到错误,因为特殊字符会弄乱您的查询:

  

SELECT * FROM test LIKE&#39;男士香蕉&#39;

应该对单引号进行转义,以使查询正常工作:

  

SELECT * FROM test LIKE&#39; men's banana&#39;

如前所述,PDO正在为您做这件事。 一旦您的网页在线(SQL注入),这也是一个很大的安全问题。

当您打印回复时,问题也是一样的。将值赋予文本框会使属性变得混乱:

  

&lt; input type =&#39; text&#39;价值=&#39;男士香蕉&#39; /&GT;

请改用正常的引号:

  

&lt; input type =&#34; text&#34;价值=&#34;男士香蕉&#34; /&GT;

答案 1 :(得分:0)

您可以使用多种功能。检查https://php.net/htmlentitieshttp://php.net/manual/en/function.addslashes.php。他们俩都应该这样做。

在代码中使用htmlentities()的示例:

echo "<td><label for='prod_brand'>Product Brand:</label></td>
  <td><input name='prod_brand' id='prod_brand' type='text' class='col1' placeholder='Auto Complete Form' value='" . htmlentities($prodbrand, ENT_QUOTES) . "'/></td>";

代码中使用addslashes()的示例:

echo "<td><label for='prod_brand'>Product Brand:</label></td>
  <td><input name='prod_brand' id='prod_brand' type='text' class='col1' placeholder='Auto Complete Form' value='" . addslashes($prodbrand) . "'/></td>";

希望这有帮助。

答案 2 :(得分:0)

你可以这样写echo

 echo <<<HTML
     <tr>
     <td><label for="prod_price">Product Name:</label></td>
     <td><input name="prod_name" id="prod_name" type="text" class="col1" value="$prodname"></td>
     </tr>
HTML;

答案 3 :(得分:0)

查看您的输入元素:

<input name='prod_name' id='prod_name' type='text' class='col1' value='$prodname'>

当您从DB中选择数据时,prodname可以说:

$prodname="12'3"

替换后,您的输入元素将是:

<input name='prod_name' id='prod_name' type='text' class='col1' value='12'3'>

你现在能看到它为什么不起作用吗?

另外请记住,这可能是严重的安全问题。看看当prodname是邪恶的东西时会发生什么,例如:

$prodname="' onclick='...some malicious js...' '"

echo将发送:

<input name='prod_name' id='prod_name' type='text' class='col1' value='' onclick='...some malicious js...' ''>

好主意是使用 mysql_real_escape_string()在数据库插入之前转义每个字符串。不要使用addslashes或htmlentities。

因此,当您插入/更新时,使用mysql_real_escape_string()转义字符串以避免SQL注入等。这样的事情应该有效:

mysql_query("insert into invertory (prod_brand, prod_name) values (".mysql_real_escape_string($prodbrand).", ".mysql_real_escape_string.")")

或者你可以在循环中转义所有字符串。

稍后当您选择数据并回显HTML时,为了保持HTML一致,您必须转义的唯一字符就是撇号。因此,在每个字符串上,您必须将其转换为Web浏览器仍然可以理解的内容 - HTML代码(对于撇号为&#39;):

echo "<input name='prod_name' value='".strtr($prodname, array("'"=>'&#39;'))."'>"