插入包含撇号(单引号)的数据时出现MySQL错误?

时间:2011-09-29 16:50:11

标签: php mysql

当插入查询包含引号(例如Kellog's)时,它无法插入记录。

错误味精:

  

您的SQL语法有错误;检查手册   对应于您的MySQL服务器版本,以便使用正确的语法   靠近's','玉米片170g','$ 15.90','$ 15.90','$ 14.10',' - ')'at'   1MySQL更新错误:

第一个's'应为Kellogg's

有没有解决方案?

10 个答案:

答案 0 :(得分:17)

Escape引用反斜杠。与'Kellogg\'s'一样。


以下是您的功能,使用mysql_real_escape_string

function insert($database, $table, $data_array) { 
    // Connect to MySQL server and select database 
    $mysql_connect = connect_to_database(); 
    mysql_select_db ($database, $mysql_connect); 

    // Create column and data values for SQL command 
    foreach ($data_array as $key => $value) { 
        $tmp_col[] = $key; 
        $tmp_dat[] = "'".mysql_real_escape_string($value)."'"; // <-- escape against SQL injections
    } 
    $columns = join(',', $tmp_col); 
    $data = join(',', $tmp_dat);

    // Create and execute SQL command 
    $sql = 'INSERT INTO '.$table.'('.$columns.')VALUES('. $data.')'; 
    $result = mysql_query($sql, $mysql_connect); 

    // Report SQL error, if one occured, otherwise return result 
    if(!$result) { 
        echo 'MySQL Update Error: '.mysql_error($mysql_connect); 
        $result = ''; 
    } else { 
        return $result; 
    } 
}

答案 1 :(得分:3)

您应该在mysql_real_escape_string(trim($val))中传递变量数据,其中$val是您收到错误的数据。

如果你输入文字,即“我喜欢Kellog's”,我们在字符串中有一个',这样就会破坏查询。为了避免这种情况,您需要将数据存储在像$val = "I love Kellog's"这样的变量中。

现在,这应该有效:

$goodval = mysql_real_escape_string(trim($val));

答案 2 :(得分:2)

mysql替换为mysqli。使用此

mysqli_real_escape_string($connection,$_POST['Description'])

答案 3 :(得分:1)

你需要使用\来转义撇号(即告诉SQL撇号是字面意思而不是字符串的开头或结尾)。

在凯洛格的撇号之前加一个\,给你凯洛格的。

答案 4 :(得分:1)

在标准SQL中,您使用两个单引号来表示单引号,因此:

INSERT INTO SingleColumn(SingleChar) VALUES('''');

第一个引号打开字符串;第二个和第三个是单引号;第四个终止字符串。在MySQL中,您也可以使用反斜杠:

INSERT INTO SingleColumn(SingleChar) VALUES('\'');

因此,在您的示例中,其中一个或两个都应该有效:

INSERT INTO UnidentifiedTable
    VALUES('Kellog''s', 'Corn Flakes 170g', '$ 15.90', '$ 15.90', '$ 14.10', '--');
INSERT INTO UnidentifiedTable
    VALUES('Kellog\'s', 'Corn Flakes 170g', '$ 15.90', '$ 15.90', '$ 14.10', '--');

在PHP中,有一个函数可以在将用户数据嵌入到SQL语句之前对其进行清理(或mysql_real_escape_string) - 或者您应该使用占位符。请注意,如果您没有清理数据,则会导致SQL Injection次攻击。

答案 5 :(得分:0)

使用此人。

mysql_real_escape_string(trim($val));

答案 6 :(得分:0)

您还可以使用addslashes()功能自动将\放在'之前以避免错误

答案 7 :(得分:0)

针对多个版本的PHP进行了优化

function mysql_prep($value){
        $magic_quotes_active = get_magic_quotes_gpc();
        $new_enough_php = function_exists("mysql_real_escape_string");//i.e PHP>=v4.3.0
        if($new_enough_php){//php v4.3.o or higher
            //undo any magic quote effects so mysql_real_escape_string( can do the work
            if($magic_quotes_active){
                $value = stripslashes($value);  
            }
            $value = mysql_real_escape_string(trim($value));
        }else{//before php v4.3.0
            //if magic quotes arn't already on, add slashes  
            if(!$magic_quotes_active){
                $value = addslashes($value);
            //if magic quotes are already on, shashes already exists        
            }   

        }
        return $value;
    }

现在只需使用:

mysql_prep($_REQUEST['something'])

答案 8 :(得分:0)

使用辅助函数来逃避它:

function safeDBname($table_name)
{
  $outputText=str_replace("&#39;","",$outputText);
  return strtolower($outputText);
}

答案 9 :(得分:0)

我做到了如下-

在我的案例描述字段中包含撇号(')。

这是代码:

$description=mysql_real_escape_string($description);

"insert into posts set name='".$name."', address='".$address."', dat='".$dt."', description='".$description."'";

它解决了我的问题