0

我有使用 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";
        }
4

1 回答 1

1

嗯!我想我可能已经找到了问题所在。问题可能不在于查询,而在于 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[约翰] = 真;$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];
        }
    }
}

希望这可以帮助!

于 2011-11-01T19:00:54.703 回答