Php SQLSTATE[23000]:完整性约束冲突:1062项“id”的重复项“0”

Php SQLSTATE[23000]:完整性约束冲突:1062项“id”的重复项“0”,php,pdo,Php,Pdo,SQLSTATE[23000]有问题:完整性约束冲突:1062此处的键“id”的重复项“0” 在表中,我有两个id为0和1的条目,因此它不能复制id。。 那有什么问题? 谢谢大家! 不知道为什么还没有人发现它——通常会有3到5个人发现像这样愚蠢的基本语法错误。从var_转储的查询中可以清楚地看到这一点 其中一个最重要的好处是预处理语句的格式是完整的,而不是PHP人员使用的部分格式。因此,在使用准备好的语句时,不必手动格式化值,以避免双重格式化 $q .= " AND `".$row[$i]."`

SQLSTATE[23000]有问题:完整性约束冲突:1062此处的键“id”的重复项“0”

在表中,我有两个id为0和1的条目,因此它不能复制id。。 那有什么问题?
谢谢大家!

不知道为什么还没有人发现它——通常会有3到5个人发现像这样愚蠢的基本语法错误。从var_转储的查询中可以清楚地看到这一点

其中一个最重要的好处是预处理语句的格式是完整的,而不是PHP人员使用的部分格式。因此,在使用准备好的语句时,不必手动格式化值,以避免双重格式化

$q .= " AND `".$row[$i]."` = :".$row[$i];
一定是这样

请注意,您的函数对SQL注入非常开放

我还发现整个函数集都不可用。我不知道你为什么要用如此有限的SQL子集来束缚自己。为什么不编写干净的纯SQL?为什么要用一些自酿的语法来代替它,除了作者之外,其他人都读不懂

还要注意的是,所有这些“休斯顿我们遇到了一个问题”是完全无用的。如果您摆脱了这个try-catch的东西,PHP将完成所有记录、退出和告知问题的工作,并且比您的代码做得更好

我会怎么做:

$db   = new safeMysql();
$data = array("id" => 4, "login" => "Paul", "pass" => 135246, "level" => 2, 
              "date" => "2013-06-22", "name" => "Paulio",  "sex" => 1, 
              "birth"=> "1996-06-25");
$db->query("INSERT INTO users SET ?u", $data);

看,我保持SQL的自然性,这使我的查询更加灵活。如果我需要插入忽略怎么办?还是替换而不是插入?使用我的方法,我只需更改查询中的一个单词。而你将陷入困境。对于SELECT查询,这将更加麻烦。

这里没有什么神奇之处,您正在尝试插入id=0的记录,该记录已经存在,我打赌它是主键。在每次插入时执行var_dump$sql,您将看到您试图插入的内容。var_dump:objectPDOStatement4 1{[queryString]=>string164插入到用户id、登录名、密码、级别、日期、名称、性别、出生值中:id'、':login'、':pass'、':level'、':date'、':name'、':sex'、':birth'}在表中我有两个id为0和1的条目,所以它不能复制id。。那有什么问题?这就是问题所在不,不要转储pdo对象,转储数据数组。。。包含值的一个insert循环在应该使用$val i时使用$row作为第二个循环谢谢。但我仍然有一个错误=您需要删除所有函数中占位符周围的单引号。我需要使用PDO。如果可以,我更喜欢纯SQL。。。“休斯顿,我们有问题”怎么样?当我使用PDO时,为什么try-catch构造不好?好的。现在我有:值:id,:login,:pass,:level,:date,:name,:sex,:birth。更改为SQLSTATE[HY093]时出错:参数编号无效:未指定任何参数1。PDO确实使用纯SQL,但您的函数不使用。我将更新我的答案,告诉您我的意思。2.试抓是不好的方式,你正在使用它。如果你摆脱了这个try-catch的东西,PHP会做得更好
$q .= " AND `".$row[$i]."` = :".$row[$i];
$db   = new safeMysql();
$data = array("id" => 4, "login" => "Paul", "pass" => 135246, "level" => 2, 
              "date" => "2013-06-22", "name" => "Paulio",  "sex" => 1, 
              "birth"=> "1996-06-25");
$db->query("INSERT INTO users SET ?u", $data);