Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/252.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
插入数据时出现PHP MYSQL错误_Php_Mysql_Mysqli_Kohana - Fatal编程技术网

插入数据时出现PHP MYSQL错误

插入数据时出现PHP MYSQL错误,php,mysql,mysqli,kohana,Php,Mysql,Mysqli,Kohana,我得到以下错误: 2016-04-26 15:11:56---调试:将用户数据插入旧数据库时出错:数据库_异常[0]:[1064]您的SQL语法有错误;在第1行APPPATH/classes/database/mysqli.php[179]中,查看与您的MySQL服务器版本对应的手册,以获得正确的语法 对于php查询: $result = $usdb->query(Database::INSERT, "INSERT INTO users (id, `password`, group_id

我得到以下错误:

2016-04-26 15:11:56---调试:将用户数据插入旧数据库时出错:数据库_异常[0]:[1064]您的SQL语法有错误;在第1行APPPATH/classes/database/mysqli.php[179]中,查看与您的MySQL服务器版本对应的手册,以获得正确的语法

对于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查询中的值是字符串(不是整数),则需要在值周围加上单引号

列和表引用可以用反勾号封装,尽管它们不必这样,前提是它们不使用保留关键字。另一方面,值的周围通常需要单引号(当然,除非您是通过prepared语句准备值;或者如果您确定数据库模式使用整数类型)

在整数周围加上单引号同样有效,因此用单引号将任何值括起来可能是安全的,如下所示:

$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语句的逻辑

您可以在中阅读有关准备好的语句的更多信息

因此,您的SQL应该是这样的:

$sql = "
    INSERT INTO users (id, `password`, group_id , active, created, updated) 
    VALUES (
        :id, 
        :password, 
        :group_id, 
        :active, 
        :created, 
        :updated
    )
";

然后将实际值绑定到准备好的语句中。

因为
密码
列是
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'] 
          . ")");
表和列名应使用反勾(`),字符串应使用单引号(')。只有当表名或列名为时才需要反勾号,但最好避免保留字

旁注:用于防止数据库进行任何类型的SQL注入

从PDO::准备

调用PDO::prepare()和PDOStatement::execute()来处理将多次使用不同参数值发出的语句,通过允许驱动程序协商查询计划和元信息的客户端和/或服务器端缓存来优化应用程序的性能,而且无需手动引用参数,有助于防止SQL注入攻击。


password
字段的类型为
VARCHAR
,因此值
$user['password']
应封装在单引号中。单引号还是双引号?请不要同时标记
mysql
sql server
。它们是两个完全不同的数据库,它们不是同一件事。@apandey,单引号。@RajdeepPaul我确实添加了单引号,但仍然得到相同的错误?@Sean很可能他使用了一些整型列,尽管单引号从来没有真正起作用,所以我想我会发布一些东西,不管他的模式的细节如何。再看看OPs列类型,它们都是
int
/
tinyint
,除了
password
,所以尽管引用其他值有效,但完全没有必要。