从用户输入向mysql数据库添加排名

时间:2016-08-19 16:13:01

标签: php mysql

我希望有人可以帮助我。我在这里发现了一个帖子,允许用户在文本框中输入单词,并用逗号分隔,它将每个单词分别添加到MySQL数据库中。我试图编辑它以匹配我的表,但它没有运作。

这是PHP / HTML:

<?php 
    //Connect safely to your database
    try {
        $db = new PDO("mysql:host=localhost;dbname=DBNAME", 'USER', 'PASSWORD');
        $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
        $db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE,PDO::FETCH_ASSOC);
    } catch (PDOException $e) {
        die('Cannot connect to mySQL server. Details:'.$e->getMessage());
    }

    $i=1;
    if ($_SERVER['REQUEST_METHOD']=='POST' && !empty($_POST['words'])) {
        $sql = "INSERT INTO rank (id, rank, position) VALUES ('$i', ':word', '$i')";
        $stmt = $db->prepare($sql);
        $stmt->bindParam(':word', $word);

        foreach (explode(',', $_POST['words']) as $word) {
            $word = trim($word);
            if (empty($word)) {
                continue;
            }
            $stmt->execute();
            $i++;
        }
    }
    //Your form
?>
<h1>Words</h1>
<form method="POST" action="">
    <input type="text" name="words"/>
    <input type="submit" name="submit" value="Submit"/>
</form>

秩表的id是自动增量int(10),rank是varchar(50),而position是int(10)。 id和position应该增加每个等级1,等级2,等级3,依此类推。等级1将是[1,等级1,1],等级2将是[2,等级2,2]等......

我一直在:

[19-Aug-2016 10:49:14 America/Chicago] PHP Fatal error:  Uncaught exception 'PDOException' with message 'SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '1' for key 'PRIMARY'' in /home/wiredtutorial/public_html/ranks.php:26
Stack trace:
#0 /home/wiredtutorial/public_html/ranks.php(26): PDOStatement->execute()
#1 {main}
  thrown in /home/wiredtutorial/public_html/ranks.php on line 26

1 个答案:

答案 0 :(得分:0)

您的错误发生是因为您尝试输入已存在的id。您在查询中放置的$i不是:word之类的绑定参数。它是一个硬编码的值。因此,使用$i++在循环内增加它对下一个查询没有影响。

如果您的id字段设置为自动递增,请不要在查询中提供该字段。数据库将为您设置它。

至于位置,它应该被绑定到一个变化的参数,因为:word是。

$sql = "INSERT INTO rank (rank, position) VALUES (:word, :pos)"
$stmt = $db->prepare($sql);
$stmt->bindParam(':word', $word);
$stmt->bindParam(':pos', $pos);
$pos = 0;

foreach (explode(',', $_POST['words']) as $w){
    $word = trim($w);
    if(empty($word)) continue;
    $pos++;
    $stmt->execute();
}