当插入查询包含引号(例如Kellog's
)时,它无法插入记录。
错误味精:
您的SQL语法有错误;检查手册 对应于您的MySQL服务器版本,以便使用正确的语法 靠近's','玉米片170g','$ 15.90','$ 15.90','$ 14.10',' - ')'at' 1MySQL更新错误:
第一个's'
应为Kellogg's
。
有没有解决方案?
答案 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("'","",$outputText);
return strtolower($outputText);
}
答案 9 :(得分:0)
我做到了如下-
在我的案例描述字段中包含撇号(')。
这是代码:
$description=mysql_real_escape_string($description);
"insert into posts set name='".$name."', address='".$address."', dat='".$dt."', description='".$description."'";
它解决了我的问题