0

我正在用 php 制作一个具有标题和描述区域的表单。当我提交表单并尝试将数据插入 MYSQL 时,我收到一个错误,这似乎是由于标题中的分号造成的。

您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“俱乐部”、“设计和开发”、“1”)附近使用正确的语法

询问

INSERT INTO Projects (ID, Title, Description, Status) 
        VALUES (0, 'Women's Club', 'Description of Project', '1')

我尝试使用 mysql_real_escape_string() 但我仍然收到此错误。

我需要使用另一种方法来允许将分号插入 mysql 吗?

这是我使用的一些代码。

$desc =  mysql_real_escape_string($_POST['desc']);

$q = "INSERT INTO Projects (ID, Title, Description, Status) 
           VALUES (0, '$title', '$desc', '1')";

感谢您的帮助。

4

4 回答 4

3

错误不在于您的$desc. 相反,它与您的$title.

也添加这一行:

$title = mysql_real_escape_string($title);

就在插入查询之前。

旁注:不要使用mysql_*函数。它们已被弃用。

于 2013-01-26T18:19:42.940 回答
1

您应该使用mysqli_orPDO绑定参数。mysql_函数已被弃用,您的代码易受 SQL 注入攻击。只要确保魔术引号被禁用。

$link = mysqli_connect('localhost', 'my_user', 'my_password', 'world');

/* check connection */
if (!$link) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}
$stmt = mysqli_prepare($link, "INSERT INTO Projects (ID, Title, Description, Status)  VALUES (0, ?, ?, 1)");
mysqli_stmt_bind_param($stmt, 'ss', $title, $desc);

/* execute prepared statement */
mysqli_stmt_execute($stmt);
于 2013-01-26T18:20:15.483 回答
1

你显然是在给自己注射。标题也需要转义。

您的代码非常不安全。不要使用mysql_*并且不要让您的查询未参数化(它们需要进行清理)!

$pdo = new PDO('mysql:host=localhost', $username, $password);
$stmt = $pdo->prepare("INSERT INTO Projects VALUES (null, ?, ?, 1)");
$stmt->execute($title, $desc);

如果magic_quotes_gpc启用,stripslashes请在 POST 标量值上使用。这不会影响安全性,但如果您不这样做,您的行将有额外的斜线。

于 2013-01-26T18:21:07.723 回答
-1

您必须在特殊的 mysql 字符中添加斜杠。

http://php.net/manual/en/function.addslashes.php

于 2013-01-26T18:21:05.603 回答