2011-11-01 68 views
0

我有脚本,输入名称到MySQL数据库,使用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"; 
     } 
+0

你碰巧知道,mysql_real_escape_string是什么? –

+0

它附加了一个反斜杠,以便撇号被作为字符串处理,而不是作为代码 – Nick

+0

处理,那么为什么你认为这是一个问题?顺便说一句,任何机会,你可以缩短你的代码一个因素,比如5? –

回答

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将包含因为$名称已经包含了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包含从数据库中检索,比如奥谢没有反斜杠转义值。由于这不是$ not_in包含的内容,unset()将不起作用。这意味着所有的撇号值都保留在$ not_in数组中。

所以解决的办法是将非转义值保留在$ not_in中。

希望这是有道理的!

==========编辑:在回答关于如何保持转义值$ NOT_IN:

的想法是不要逃避只是在需要的地方。以下是你可能会做你的代码的更改:

改写为)为下面的第一个(:

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]; 
     } 
    } 
} 

希望这有助于!

+0

谢谢,它是有道理的,但我不知道如何保持$ not_in中未转义的值。 – Nick

+0

嘿@nick,请参阅上面我的回复中的编辑部分 – Abhay

+0

非常感谢Abhay。上述变化似乎工作正常,我已经回答了这个问题。如果您对脚本如何更高效地运行有任何其他想法,我很乐意听到它们。基本上,我只需要一个错误,如果我的表单中的任何名称都没有在数据库中找到。你是否建议,如果在表单上输入了多个名称,而其中一个名称没有找到,但其他名字是,那么脚本可以更新找到的名称,并为其名称生成错误,以便只有还没有找到的名字需要重新输入? – Nick