我有使用mysql_real_escape_string将名称输入MySQL数据库的脚本,以便正确处理撇号。我遇到的麻烦是使用下面的脚本,该脚本检查以查看使用另一种格式输入的名称是否对应于我的数据库中已经存在的名称,以及是否找到了更新行的名称。
当我尝试在此脚本处理的表单中输入带撇号的名称时,收到一条错误消息,指出找不到该名称,并且错误消息中的名称在撇号之前包含反斜杠,这显然是问题。
所以问题是,如何修改下面的脚本,使其能够使用带撇号的名称?
谢谢,
缺口
$row_count = count($_POST['name']);
if ($row_count > 0) {
mysql_select_db($database, $connection);
$name = array();
$workshop = array();
$not_found = array();
for($i = 0; $i < $row_count; $i++) {
// variable sanitation...
$name[$i] = mysql_real_escape_string(ucwords($_POST['name'][$i]));
$workshop[$i] = mysql_real_escape_string($_POST['workshop'][$i]);
}
$names = "('".implode("','",$name)."')";
$not_in = Array();
// lets say all names doesn't exist in `conference`
foreach($name as $value) {
// names in array are keys, not values
$not_in[$value] = true;
}
$query = mysql_query("SELECT Name FROM conference WHERE Name IN $names");
while(list($dbname) = @mysql_fetch_row($query)) {
// delete those name from $not_in who exists
unset($not_in[$dbname]);
}
// names in $not_in array are keys, not values
$not_in = array_keys($not_in);
if(empty($not_in)) {
// its ok, all names have been found. do the magic.
for($i = 0; $i < $row_count; $i++) {
$sql = "UPDATE conference SET Workshop = '$workshop[$i]' WHERE Name LIKE '$name[$i]'";
mysql_query($sql);
$body .= "Name: " . $name[$i] . " Workshop: " . $workshop[$i] . "\n\n";
}
最佳答案
嗯!我想我可能已经找到了问题。问题可能与查询无关,而与PHP代码有关。我将在下面使用您的示例John O'Shea进行解释。
for($i = 0; $i < $row_count; $i++) {
// variable sanitation...
$name[$i] = mysql_real_escape_string(ucwords($_POST['name'][$i]));
$workshop[$i] = mysql_real_escape_string($_POST['workshop'][$i]);
}
$names = "('".implode("','",$name)."')";
$not_in = Array();
// lets say all names doesn't exist in `conference`
foreach($name as $value) {
// names in array are keys, not values
$not_in[$value] = true;
}
在上面的代码之后,数组$ not_in将包含转义键,因为$ name已经包含使用mysql_real_escape_string()转义的值。因此,例如:
$ not_in [John] = true;
$ not_in [John O \'Shea] = true;
$query = mysql_query("SELECT Name FROM conference WHERE Name IN $names");
while(list($dbname) = @mysql_fetch_row($query)) {
// delete those name from $not_in who exists
unset($not_in[$dbname]);
}
现在,上面的代码中的$ dbname包含从数据库检索的未转义的值,例如John O'Shea,不带反斜杠。由于这不是$ not_in包含的内容,因此unset()将不起作用。这意味着所有撇号值都保留在$ not_in数组中。
因此解决方法是将未转义的值保留在$ not_in中。
希望这有道理!
==========编辑:响应如何在$ not_in中保留未转义的值:
这个想法是在需要的地方进行转义。以下是您可能对代码所做的更改:
重写第一个for(),如下所示:
for($i = 0; $i < $row_count; $i++) {
// variable sanitation...
//$name[$i] = mysql_real_escape_string(ucwords($_POST['name'][$i]));
$name[$i] = ucwords($_POST['name'][$i]);
$workshop[$i] = mysql_real_escape_string($_POST['workshop'][$i]);
}
$names = "('" . mysql_real_escape_string(implode("','",$name)) . "')";
并将UPDATE语句重写为:
$sql = "UPDATE conference SET Workshop = '$workshop[$i]' WHERE Name LIKE '" . mysql_real_escape_string($name[$i]) . "'";
顺便说一句,根据您的代码,如果数据库中不存在一个名称,则UPDATE将不会运行。仅在数据库中找到所有$ _POST ['name']时,才绝对需要运行UPDATE吗?如果没有,则可以大大减少代码量。
我尚未测试上述更改,但我认为它们应该起作用。让我知道您是否有任何问题。
==========编辑2:用于更新现有记录并为不存在的记录生成错误的代码段
嘿尼克,我认为只有编写以下代码才能达到目的:
$row_count = count($_POST['name']);
if ($row_count > 0) {
mysql_select_db($database, $connection);
for ($i = 0; $i < $row_count; $i++) {
mysql_query("UPDATE conference SET Workshop = '" . mysql_real_escape_string($_POST['workshop'][$i]) . "' WHERE Name LIKE '" . mysql_real_escape_string($_POST['name'][$i]) . "'");
$affectedRows = mysql_affected_rows();
if ($affectedRows == 0) {
echo '<br>Name did not exist - ' . $_POST['name'][$i];
}
}
}
希望这可以帮助!
关于php - 当名称包含撇号时,匹配通过MySQL数据库通过表单提交的名称的脚本将中断,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7970266/