当我从数据库查询时,例如产品,"男士香蕉"它只显示" 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>
答案 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/htmlentities和http://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代码(对于撇号为'
):
echo "<input name='prod_name' value='".strtr($prodname, array("'"=>'''))."'>"