2016-08-19 13 views
0

私は誰かがこれを手伝ってくれることを願っています。私は、ここにユーザーがテキストボックスに単語を入力できるようにするポストを見つけ、コンマで区切って、それぞれの単語を別々に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> 

ランクテーブルは、自動インクリメントINT(10)、VARCHAR(50)であるランクのID、及びINT(10)の位置を有しています。 IDと位置は、ランク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

'rank'テーブルのIDフィールドが自動インクリメントに設定されていることを確認してください。その後、 'UPDATE'ステートメントから' id'を取り除くことができます。 – pmahomme

+0

ランクを必要に応じて表示してみませんか? emを保存しないでください – Drew

+0

私はadminを許可しようとしています。初めてこれを設定して、自分のランクをフォームに追加します。 私のリストのように見えるのであれば、例えば、:ランク1、ランク2は、クールランク、スーパーランク、それは次のようにランクテーブルに追加します。、 1ランク1,1 2、ランク2、 2 3、クールランク3、 4、スーパーランク4 –

答えて

0

あなたのエラーが原因で発生すでに存在するidを入力しようとしています。クエリに入れた$iは、:wordのようなバインドされたパラメータではありません。これはハードコードされた値です。結果として、$i++でループ内で値を増やしても、次のクエリには影響しません。

idフィールドが自動インクリメントに設定されている場合は、クエリに入力しないでください。 DBがそれを設定します。

位置は、: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(); 
} 
+0

これは完璧に機能しました。ありがとうございました。 –

関連する問題