1

我正在使用 ajax 来收集要提交的 ckeditor 数据。问题只是第一个撇号之前的内容被提交到数据库。我可能做错了什么?

编辑:

$date = strtotime($formData['date']);
$article=mysql_real_escape_string($formData['article'],$DBconnect);

$DBconnect=mysql_connect($dbVals['host'],$dbVals['user'],$dbVals['pass']);

mysql_select_db($dbVals['db'], $DBconnect);
$SQLstring="INSERT INTO PressRelease (ip, tym, title, date, article) VALUES('${_SERVER['REMOTE_ADDR']}', ".time().",'${formData['title']}', '$date', '$article')";

我对此很陌生,所以如果您需要查看其他任何内容以帮助我知道。

4

3 回答 3

2

听起来您在将文本数据插入数据库之前并没有对其进行转义。在将数据传递到 SQL 查询之前,对数据使用此函数:

http://www.php.net/manual/en/function.mysql-real-escape-string.php

编辑:抱歉,假设您使用的是 MySQL。

于 2010-02-03T15:04:19.917 回答
1

与 Mark 建议的方法相比,一种不同的、更复杂且可以说更优越的方法是使用Parameterized Statements

借用维基百科的一个例子:

<?php
$db = new mysqli("localhost", "user", "pass", "database");
$stmt = $db -> prepare("SELECT priv FROM testUsers WHERE username=? AND password=?");
$stmt -> bind_param("ss", $user, $pass);
$stmt -> execute();
?>

它将转义留给 MySQL 驱动程序,大大减少了 SQL 注入和意外双重转义之类的事情的机会。

请注意,使用旧的 MySQL 函数这是不可能的。您需要改进的 MySQLI函数/对象,或类似PDO的东西。

于 2010-02-03T15:14:12.733 回答
1

如果我理解正确,情况如下:

  • 你有一个被CKeditor“接管”的textarea
  • 您正在使用 Javascript 阅读该文本区域的内容
  • 您正在使用 AJAX 将收集的内容发送到服务器

如果你 alert() Javascript 从 textarea 获取的内容,你可以看到第 2 步是否成功。如果没有,请发布您的 Javascript。

如果第 2 步是正确的,那么可能是服务器端有问题,转储您的数据库查询以查看。

更新: 确保在开发时打开所有错误和通知。如果你正在做一些你不能轻易“看到”的东西,比如 AJAX,一定要留意你的服务器的错误日志。

在您的代码示例第 2 行中,您使用 $DBconnect,然后在第 4 行中定义它是什么。如您在mysql_real_escape_string 的 PHP.net 条目中所见,如果函数找不到与数据库的连接,则该函数会生成错误并返回 FALSE。FALSE 被放入您的数据库中,这就是您的数据库中的内容。

我给你的建议是:在调试时更加努力。测试所有假设,在每一步测试变量的值,检查它们是否具有您期望的值。使用 var_dump()、print_r()、echo 和 die()。或者,如果您想要更高级的东西,请使用调试器(我没有)。

于 2010-02-03T15:14:46.883 回答