在选择列表中单引号后截断Mysql数据

时间:2013-09-30 03:58:34

标签: php mysql regex

我在Mysql数据库中有一些包含单引号(')的部件号,例如1234'xyz。我有一个相当冗长的HTML页面,包括一个选择列表,它将使用单引号正确显示部件号。但是,在表单POST之后,如果部件号包含单引号,则会显示该部件号,以便截断单引号后面的所有字符。在上面的例子中,部件号将显示1234。

这是我如何逃避表单输入并发布表单:

array_walk_recursive( $_POST, 'mysqli_real_escape_string' ); //escape the array
$array = array_filter($_POST);  //remove empty values from the array

//---- convert key/values to string to insert as column names/values to insert          

foreach ($array as $key => $value) {
$value = "'$value'";
    $updates[] = "$key = $value";
            }   

$implodeArray = implode(', ', $updates);
$id=$_SESSION['Userid'];

$query = ("UPDATE Database
        SET $implodeArray
        WHERE Userid='$id'");

表单输入是否可能无法转义?

1 个答案:

答案 0 :(得分:0)

假设您已检查$ _POST key =>值对并确认正在传递预期值,我认为您上面的代码可能会取消“mysqli_real_escape_string”转义的效果字符,通过在双引号"$value" ...中再次插值两次!然后再次插入"$implodeArray"

TRY:

foreach ($array as $key => $value) {
$value = "'".$value."'";
    $updates[] = "$key = ".$value;
            }   

$implodeArray = implode(', ', $updates);
$id=$_SESSION['Userid'];

$query = ("UPDATE Database
        SET ".$implodeArray."
        WHERE Userid='$id'");

希望有所帮助