PHP MYSQL 插入数据时出错
PHP MYSQL ERROR when inserting data
我收到以下错误:
2016-04-26 15:11:56 --- DEBUG: Error ocurred where inserting user data to the legacy db :Database_Exception [ 0 ]: [1064] 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 ')' at line 1 ~ APPPATH/classes/database/mysqli.php [ 179 ]
对于 php 查询:
$result = $usdb->query(Database::INSERT, "INSERT INTO users (id, `password`, group_id , active, created, updated) VALUES ({$user['id']}, {$user['password']}, {$user['group_id']}, {$user['active']}, {$user['created']}, {$user['updated']})");
列类型如下:
id : int AI PK
password : varchar
group_id : int
active : tinyint
created : int
updated : int
您需要在 SQL 查询中用单引号 '
括起您的值,假设它们是数据库中的字符串(不是整数)。
列和 table 引用 可以 用反引号封装,但他们不必这样做,假设他们没有使用保留关键字。另一方面,值 通常 需要在它们周围加上单引号(当然,除非您通过准备好的语句来准备您的值;或者如果您确定数据库模式使用整数类型)。
用单引号将整数括起来也同样有效,因此用单引号将任何值括起来可能是安全的,如下所示:
$result = $usdb->query(
Database::INSERT,
"INSERT INTO users (id, `password`, group_id , active, created, updated)
VALUES (
'{$user['id']}',
'{$user['password']}',
'{$user['group_id']}',
'{$user['active']}',
'{$user['created']}',
'{$user['updated']}'
)
"
);
注:
您应该始终使用参数化查询(准备好的语句)。将原始 PHP 变量注入 SQL 查询是极其不安全的。如果你有一个带单引号的变量,它会破坏你的 SQL 语句的逻辑。
您可以在 the PHP manual 中阅读有关准备语句的更多信息。
所以你的SQL应该真正是这样的:
$sql = "
INSERT INTO users (id, `password`, group_id , active, created, updated)
VALUES (
:id,
:password,
:group_id,
:active,
:created,
:updated
)
";
然后将您的实际值绑定到准备好的语句中。
由于 password
列的类型为 VARCHAR
,所以值 $user['password']
应该用单引号引起来。由于其余列的类型为 INT
或 TINYINT
,因此不需要单引号。
所以你的查询应该是这样的:
$result = $usdb->query(Database::INSERT, "INSERT INTO users (`id`, `password`, `group_id` , `active`, `created`, `updated`)
VALUES (" . $user['id'] . ", '"
. $user['password'] . "', "
. $user['group_id'] . ", "
. $user['active'] . ", "
. $user['created'] . ", "
. $user['updated']
. ")");
您应该对 table 和列名使用反引号 (`),对字符串使用单引号 (')。仅当您的 table 名称或列名称是 MySQL reserved word 时才需要反引号,但最好避免使用保留字。
旁注: 使用 PDO prepare 来防止您的数据库受到任何类型的 SQL 注入。
来自 PDO::prepare
Calling PDO::prepare() and PDOStatement::execute() for statements that will be issued multiple times with different parameter values optimizes the performance of your application by allowing the driver to negotiate client and/or server side caching of the query plan and meta information, and helps to prevent SQL injection attacks by eliminating the need to manually quote the parameters.
我收到以下错误:
2016-04-26 15:11:56 --- DEBUG: Error ocurred where inserting user data to the legacy db :Database_Exception [ 0 ]: [1064] 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 ')' at line 1 ~ APPPATH/classes/database/mysqli.php [ 179 ]
对于 php 查询:
$result = $usdb->query(Database::INSERT, "INSERT INTO users (id, `password`, group_id , active, created, updated) VALUES ({$user['id']}, {$user['password']}, {$user['group_id']}, {$user['active']}, {$user['created']}, {$user['updated']})");
列类型如下:
id : int AI PK
password : varchar
group_id : int
active : tinyint
created : int
updated : int
您需要在 SQL 查询中用单引号 '
括起您的值,假设它们是数据库中的字符串(不是整数)。
列和 table 引用 可以 用反引号封装,但他们不必这样做,假设他们没有使用保留关键字。另一方面,值 通常 需要在它们周围加上单引号(当然,除非您通过准备好的语句来准备您的值;或者如果您确定数据库模式使用整数类型)。
用单引号将整数括起来也同样有效,因此用单引号将任何值括起来可能是安全的,如下所示:
$result = $usdb->query(
Database::INSERT,
"INSERT INTO users (id, `password`, group_id , active, created, updated)
VALUES (
'{$user['id']}',
'{$user['password']}',
'{$user['group_id']}',
'{$user['active']}',
'{$user['created']}',
'{$user['updated']}'
)
"
);
注:
您应该始终使用参数化查询(准备好的语句)。将原始 PHP 变量注入 SQL 查询是极其不安全的。如果你有一个带单引号的变量,它会破坏你的 SQL 语句的逻辑。
您可以在 the PHP manual 中阅读有关准备语句的更多信息。
所以你的SQL应该真正是这样的:
$sql = "
INSERT INTO users (id, `password`, group_id , active, created, updated)
VALUES (
:id,
:password,
:group_id,
:active,
:created,
:updated
)
";
然后将您的实际值绑定到准备好的语句中。
由于 password
列的类型为 VARCHAR
,所以值 $user['password']
应该用单引号引起来。由于其余列的类型为 INT
或 TINYINT
,因此不需要单引号。
所以你的查询应该是这样的:
$result = $usdb->query(Database::INSERT, "INSERT INTO users (`id`, `password`, `group_id` , `active`, `created`, `updated`)
VALUES (" . $user['id'] . ", '"
. $user['password'] . "', "
. $user['group_id'] . ", "
. $user['active'] . ", "
. $user['created'] . ", "
. $user['updated']
. ")");
您应该对 table 和列名使用反引号 (`),对字符串使用单引号 (')。仅当您的 table 名称或列名称是 MySQL reserved word 时才需要反引号,但最好避免使用保留字。
旁注: 使用 PDO prepare 来防止您的数据库受到任何类型的 SQL 注入。
来自 PDO::prepare
Calling PDO::prepare() and PDOStatement::execute() for statements that will be issued multiple times with different parameter values optimizes the performance of your application by allowing the driver to negotiate client and/or server side caching of the query plan and meta information, and helps to prevent SQL injection attacks by eliminating the need to manually quote the parameters.