所以我有一个带有下拉表单的PHP页面,当选择一个选项时,它会使用AJAX脚本从同一个MySQL表中查询结果。在大多数情况下,它的工作方式与预期相符。但是,某些结果(特别是名称中带有“或”的选项)未正确设置为AJAX / GET脚本的变量。这是我的主要PHP脚本:
<html>
<head>
<link rel="stylesheet" type="text/css" href="css/styles.css" media="screen" />
<title>Add Inventory</title>
<script>
function showUser(str)
{
if (str=="")
{
document.getElementById("txtHint").innerHTML="";
return;
}
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
document.getElementById("txtHint").innerHTML=xmlhttp.responseText;
}
}
xmlhttp.open("GET","getsku.php?q="+str,true);
xmlhttp.send();
}
</script>
</head>
<body>
<?php
session_start();
require_once('includes/config.inc.php');
require_once('includes/functions.inc.php');
// Check login status -- if not logged in, redirect to login screen
if (check_login_status() == false) {
redirect('login.php');
}
$thisPage='add';
include('includes/navbar.inc.php');
?>
<h1>Add New Inventory Record</h1>
<form method="POST" action="submitadd.php" />
<table id="add">
<tr>
<td class="headings"><b>Species:</b></td>
<td><select name="species:" onchange="showUser(this.value)">
<option value="select">Choose a Species</option>
<?php
$prodquery="SELECT name FROM products ORDER BY name ASC";
$result=mysqli_query($con,$prodquery) or die(mysqli_error($con));
while ($row = mysqli_fetch_array($result)) {
echo "<option value='" . $row['name'] . "'>" . $row['name'] . "</option>";
}
?>
</select>
</td>
</tr>
<div id='txtHint' />
<tr>
<td class="headings"><b>Fry Count:</b></td>
<td><input type="text" name="frycount" value="<?php echo $row['quantityfry']; ?>" size="35" maxlength="4" /></td>
</tr>
<tr>
<td class="headings"><b>Juvie Count:</b></td>
<td><input type="text" name="juviecount" value="<?php echo $row['quantityjuv']; ?>" size="35" maxlength="4" /></td>
</tr>
<tr>
<td class="headings"><b>Adult Count:</b></td>
<td><input type="text" name="adultcount" value="<?php echo $row['quantityadult']; ?>" size="35" maxlength="4" /></td>
</tr>
<tr>
<td class="headings"><b>Notes:</b></td>
<td><input type="text" name="notes" value="<?php echo $row['notes']; ?>" size="35" maxlength="255" /></td>
</tr>
<tr>
<td class="headings"><b>Location:</b></td>
<td><select name="location">
<?php
$options = set_and_enum_values($con, 'inventory', 'location');
foreach($options as $option):
?>
<option><?php echo $option ?></option>
<?php endforeach; ?>
</select></td>
</tr>
<tr>
<td class="headings"><b>Owner:</b></td>
<td><select name="owner">
<?php
$options = set_and_enum_values($con, 'inventory', 'owner');
foreach($options as $option):
?>
<option><?php echo $option ?></option>
<?php endforeach; ?>
</select></td>
</tr>
</table>
<br />
<input type="submit" name="submit" value="submit" class="button1" />
</form>
</body>
</html>
这是getsku.php,由AJAX脚本调用:
<?php
$q = html_entity_decode($_GET['q']);
require_once('includes/config.inc.php');
$sql="SELECT sku FROM products WHERE name = '".$q."'";
$result = mysqli_query($con,$sql);
while($row = mysqli_fetch_array($result))
{
echo "<td><input type='hidden' name='sku' value='" . $row['sku'] . "' readonly='readonly' size='35' /></td>";
}
mysqli_close($con);
?>
我一直在Firebug做一些测试,这是一个具体的例子。数据行是:
name = Lethrinops albus "Kande Island"
sku = HAP002
还有其他数据,但对此并不关心。因此,当下拉列表选择Lethrinops albus "Kande Island"
时,我希望HAP002
设置为隐藏字段并传递到此表单上的提交按钮。使用Firebug,我可以在Params下看到这个:
q Lethrinops albus "Kande Island"
哪个是对的。这是另一行数据:
name = Cynotilapia afra "Lion's Cove"
sku = MBN002
但是在Firebug中,我在Params下看到了这个:
q Cynotilapia afra "Lion
哪个不对。我假设我需要清理HTML结果,我发现了一个可能有用的功能:
function htmlsan($htmlsanitize){
return $htmlsanitize = htmlspecialchars($htmlsanitize, ENT_QUOTES, 'UTF-8');
}
但我不确定这是否是我需要的,以及如何使用它。有人能指出我正确的方向吗?
答案 0 :(得分:1)
首先,您不应该以这种方式构造SQL查询:
$q = html_entity_decode($_GET['q']);
$sql="SELECT sku FROM products WHERE name = '".$q."'";
这不是一个好习惯,而且存在SQL Injection的安全问题
为了解决所有的卫生问题(以及许多其他问题),我建议您对所有SQL连接使用PHP Data Objects (PDO)
特别是看看这个答案How can I prevent SQL injection in PHP?
使用此函数mysql-real-escape-string.php来清理MySQL查询中的输入数据。
<强> [EDITED] 强>
回答你的问题。
问题是不在您的SQL查询中。它位于<option value='problem is here!'>
。
name = Cynotilapia afra "Lion's Cove"
时,您应该使用htmlentities正确转义单引号。
echo "<option value='" . htmlentities($row['name']) . "'>" . $row['name'] . "</option>";
您可能需要在getsku.php中使用html_entity_decode解码(反向操作)。
答案 1 :(得分:0)
由于您通过GET
传递数据,因此需要urlencode()
字符串将其传递到下一页。不要在下一个脚本中解码它们。超大球已经被解码了。
进入下一个脚本后,您应该使用数据库扩展的转义函数在SQL查询中使用$_GET
参数。