我有很多文本要使用PHP插入MySQL表。部分文本如下所示:
Yes, this is 'great'!
要将其填入SQL语句,我需要转义'
。
我正在使用ereg-replace $text=mb_ereg_replace("'","\\'", $text);
进行以下工作:
$sql="insert into mytable (msg) values ('".$text."')";
现在我发现还有另一种文本样式,我必须保存到MySQL这样的东西:
As you can see the \' world\' is a "disc"!
所以我尝试添加更多mb_ereg_replace,如下所示:
$text=mb_ereg_replace("'","\\'", $text);
$text=mb_ereg_replace("\\","\\\\", $text);
但这不起作用,我只收到错误消息:PHP Warning: mb_ereg_replace(): mbregex compile err: end pattern at escape in [...]
是什么原因引起的?我可能犯了一些错误,但找不到它!
感谢您提供任何帮助。
答案 0 :(得分:2)
答案 1 :(得分:1)
有一种更好的方式,你不必担心再次逃离你的琴弦。在mysqli
或PDO
中使用预准备语句将使大型查询(具有多行的查询)运行得更快,它们是安全的,您不必担心(大多数类型的)SQL注射,它们很容易学习。这些字符串只会被接受到您的数据库中,而不会有破坏您的代码的风险。
以下是mysqli
的示例:
$conn = new mysqli($servername, $username, $password, $dbname);
$stmt = $conn->prepare("INSERT INTO table (columnname) VALUES (?)");
$stmt->bind_param("s", $text);
$stmt->execute();
$stmt->close();
基本上,通过在参数进入之前绑定参数,它只是按照您创建它的方式接受任何字符串,并且不需要转义任何内容。'
这里使用PDO是一回事。这基本上是相同的,但是它具有使用多种不同数据库类型(例如Oracle或PostgreSQL)的优点,并且由于与之关联的类而有助于进行一些漂亮的修改。
try {
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
// set the PDO error mode to exception
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $conn->prepare("INSERT INTO table (columname)
VALUES (:text)");
$stmt->bindParam(':text', $text);
$stmt->execute();
catch(PDOException $e)
{
echo "Oops, didn't work: " . $e->getMessage();
}
$conn = null;