2

我正在构建一个小型 Twitter 克隆供个人使用,但我遇到了很多麻烦。拳头,我想给你看一下我的表“poke_history”的SQL结构:http:
//puu.sh/3Sci0.png

这是我用来将值插入到表中的命令(在 PHP 中):

$insert = "INSERT INTO poke_history (id, from, time, reason) VALUES ('".$to_id."', '".$from_id."', '".$time."', '".$reason."')";
mysql_query($insert) or die(mysql_error());

这是我得到的烦人的错误:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'from, time, reason) VALUES ( '1'' at line 3.

让我澄清一些事情。
$to_id是一个数字。
$from_id是一个数字。
$time是一个数字(来自 PHP 的time())。
$reason是一个文本字符串。

我正在使用 MySQL 和 PHP5。

4

6 回答 6

2

尝试引用您的列标识符,例如

INSERT INTO poke_history (`id`, `from`, `time`, `reason`) ...

里面的所有东西都``被认为是“标识符”而不是语言关键字。从 SQL 语法中可以清楚地看出 afterINSERT INTO tablename不能出现 a FROM,但 MySQL 有时需要这种指导(以及其他 sql 解析器)。

于 2013-08-02T21:53:00.907 回答
1

也归功于马里奥:

from 是保留关键字。使用反引号来逃避它们。

例如`来自`

INSERT INTO table (`from`) ....

所以你的代码会是这样的:

$insert = "INSERT INTO poke_history (`id`, `from`, `time`, `reason`) VALUES ('".$to_id."', '".$from_id."', '".$time."', '".$reason."')";
mysql_query($insert) or die(mysql_error());
于 2013-08-02T21:51:32.817 回答
1
$insert = "INSERT INTO poke_history (`id`, `from`, `time`, `reason`) VALUES (".$to_id.", ".$from_id.", ".$time.", '".$reason."')";
mysql_query($insert) or die(mysql_error());

数字不需要引用。只有字符串。也不要使用mysql,它已被弃用。最好使用带有准备好的语句的 PDO 来避免此类问题。

于 2013-08-02T21:52:23.047 回答
0

您应该尝试使用准备好的语句来防止 SQL 注入。

$query = "
    INSERT INTO
        poke_history (`id`, `from`, `time`, `reason`)
    VALUES
        (:id, :from, :time, :reason)";

$db = new PDO("mssql:host=sqlserver;dbname=database", "username", "password");

$statement = $db->prepare($query);

$parameters = array(
    ":id" => $name,
    ":from" => $from,
    ":time" => $time,
    ":reason" => $reason
);

$statement->execute($parameters);
于 2013-08-02T22:38:05.077 回答
-1

The reason why you are getting the error is because you are trying to use a built in function name for one of your columns. Say you have the following CREATE TABLE...

CREATE TABLE customers
(
name varchar(80),
streetAddr varchar(160),
"from" varchar(60),
);

Notice that to create the table I had to put the column from in quotes. Now if you wanted to insert a row into this table, your insert statement should look like the following:

INSERT INTO ShoppingFun.dbo.customers
(
name, 
streetAddr, 
"from"
) 
VALUES 
(
'MRBubbleGum',
'1061 SW BubbleGumVillage St',
'yourmom'
)
于 2013-08-02T22:31:27.123 回答
-1

我认为您忘记在 INSERT 和 INTO 之间添加 *,这是固定脚本:

$insert = "INSERT * INTO poke_history (id, from, time, reason) VALUES ('".$to_id."', '".$from_id."', '".$time."', '".$原因。”')”; mysql_query($insert) 或死(mysql_error());

于 2013-08-02T22:19:29.320 回答