非常奇怪的重复输入错误

时间:2016-02-02 22:44:44

标签: php mysql sql

我正在使用代码重复保存数据。我第一次运行它并没有抱怨。第二次说<form name="testForm" ng-app="myApp" ng-controller="FormController" class="container-fluid" ng-submit="submit()"> <!-- form labels --> <md-button class="md-raised md-primary pull-right testForm" type ="button" ng-click ="reset()">CANCEL</md-button> <md-button class="md-raised md-primary pull-right testForm" ng-disabled="testForm.$invalid">SAVE</md-button> </form> 。我回应$ id值,每次都不同。该表是5分钟,我想它不会被破坏。我的做法错了吗?

Duplicate entry '$id' for key 'PRIMARY'

表格结构:

function insertData($conn,$data){
    $id=$data['id'];
    $name=$data['name'];
    $fp=$data['first_price'];
    $sp=$data['second_price'];
    echo "$id<br>";
    echo "$name<br>";
    echo "$fp<br>";
    echo "$sp<br>";
    $query = 'INSERT INTO names VALUES("$id", "$name", "$fp", "$fp")';
    $result = $conn->query($query);
    if (!$result){
        echo "nothing saved, sorry $conn->error";
    }
}

2 个答案:

答案 0 :(得分:3)

您尝试将字符串文字$id等插入表中,因为您使用的是单引号。

这是一个可行的例子:

$query = "INSERT INTO names VALUES('$id', '$name', '$fp', '$fp')";

现在一般来说,您不需要插入主键值,只需使用null,如果您的表设置为这样,它将自动递增。在你的情况下它不是(auto_increment未列在&#34;额外&#34;主键)。考虑添加它。

我假设->query()来自PDO库,所以为了避免SQL注入,你应该使用参数绑定,你的调整后的代码将如下所示:

$query = 'INSERT INTO names VALUES(?, ?, ?, ?)';
$stmt = $conn->prepare($query);
$stmt->execute(array($id, $name, $fp, $fp));

...或者如果你使用的是mysqli而不是PDO:

$query = 'INSERT INTO names VALUES(?, ?, ?, ?)';
$stmt = $conn->prepare($query);
$stmt->bind_param('isdd', $id, $name, $fp, $fp);
$stmt->execute();

答案 1 :(得分:1)

您的查询实际上是插入字符串$id,因为您正在使用查询字符串的单引号。这样做:

$query = "INSERT INTO names VALUES('$id', '$name', '$fp', '$fp')";

只是让你知道它背后的原因,使用单引号作为字符串会使变量被忽略。