我的问题是:如何在字符串中允许单引号?
例如,我有一个表单和一个文本框。它被设置为允许用户输入他们的名字。从那里,它发布数据并将其输入数据库。
我需要能够允许单引号(撇号),因为有些人的名字中有撇号,例如“O'Reilly”。
有什么建议么?
我的问题是:如何在字符串中允许单引号?
例如,我有一个表单和一个文本框。它被设置为允许用户输入他们的名字。从那里,它发布数据并将其输入数据库。
我需要能够允许单引号(撇号),因为有些人的名字中有撇号,例如“O'Reilly”。
有什么建议么?
不以任何方式禁止单引号。我只是假设您将其插入数据库时出错。这可能是由于省略了mysql_real_escape_string()
输入值。
如果您尝试INSERT ... ('O'Reilly')
这是 SQL 转义函数的全部要点,您将收到一个 SQL 错误。
(这就是
magic_quotes
最初引入的原因:让 SQL 对新手来说开箱即用。 - 不是为了让它特别安全。)
对插入数据库的任何文本使用mysql_real_escape_string()函数。如果您将数据直接发布到数据库中,您的脚本中可能会出现错误,因为您实际所做的是结束 MySQL 报价。
逃避数据也是安全的必要条件。您应该拥有以下内容:
$q = "INSERT INTO `table` (`body`) VALUES ('".mysql_real_escape_string($_POST['body'])."')";
如果我正确地阅读了您的问题,那么您已经将SQL 注入错误编码到您的程序中,从而允许轻微恶意的人和病毒读取和写入您的数据库。(想象一下有人在';drop table users;
一个字段中输入......再见数据。)
对抗 SQL 注入攻击的最简单方法是使用准备好的语句编写 SQL 查询,它要求数据库安全地处理输入数据:
<?php
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)");
$stmt->bindParam(':name', $name);
$stmt->bindParam(':value', $value);
// insert one row
$name = 'one';
$value = 1;
$stmt->execute();
// insert another row with different values
$name = 'two';
$value = 2;
$stmt->execute();
?>
USe like:-
insert into question(question,points,choice1,choice2,
choice3,choice4,choice3_correct,tags,error_status,
base_or_derived,language)
values('".mysql_real_escape_string($result4)."',
'".$points."','".$ans1."','".$ans2."',
'".$correct_ans."','".$ans3."','1','".$tags."',
'".$error."','D','".$language."')