2017-04-20 6 views
0

こんにちは私はコメントボックスに投稿するコードを得るために関連する変更を行ったと思いますが、まだ何も投稿していないようです。コードに残っているエラーは誰でも見ることができますか?ユーザー名を使用して、コメントボックスにデータを入力することができません。

<form action="" method="post" > 
<textarea rows="4" cols="50" name="comment"> 
Please type a comment if you are logged in.... 


</textarea> 
<input type="submit" value="Submit"> 
</form> 


<?php 
if (isset($_SESSION['username']) && !empty($_SESSION['username'])) { 
    $username = $_SESSION['username']; 
    $sqlinsert = "INSERT INTO comment (username, comment, dCpuID) VALUES ('$username', '$comment', '1')"; 
if(mysqli_query($conn, $sqlinsert)){ 

     header("Location: i5-6600k"); 
} else { 
    echo "ERROR: Could not able to execute $sqlinsert. " . mysqli_error($conn); 
} 
} 

この文書の一番上にはセッションが開始されているので、それが含まれています。コード全体がPHPタグ内にあります。

if (isset($_SESSION['username']) && !empty($_SESSION['username'])) { 

これをlogin_userに変更しました。今ではDB接続のようですが、コメントボックスの上にコメントを表示しなくてもエラーが表示されます: エラー:INSERT INTOコメント(ユーザー名、コメント、dCpuID)を実行できませんでしたVALUES( 'dan' ''、 '1')。 'フィールドリスト'に 'username'という列がありません

$sql = "SELECT `users`.`username`, `comment`.`comment`, `comment`.`timestamp`\n" 

    . "FROM `users`\n" 

    . "LEFT JOIN `comment` ON `users`.`userID` = `comment`.`userID` \n" 

    . "where dCpuID = 1"; 

$result = $conn->query($sql); 

if ($result->num_rows > 0) { 
    echo "<table><tr><th>Username</th><th>Comment</th><th>Timestamp</th>"; 
    // output data of each row 
    while($row = $result->fetch_assoc()) { 
     echo "<tr><td>" . $row["username"]. "</td><td>" . $row["comment"]."</td><td>" . $row["timestamp"]. "</td>"; 
    } 
    echo "</table>"; 
} else { 
    echo "0 results"; 
} 

上記のコードは、コメントボックスを必要に応じて表示しています。これは、入力されたdisplyedされる(それが表にあるよう多くの意味があります)の代わりに、ユーザー名のユーザーID

それが表示されます:

ERROR: Could not able to execute INSERT INTO comment (userID, comment, dCpuID) VALUES ('dan', '', '1'). Cannot add or update a child row: a foreign key constraint fails (`u803621131_login`.`comment`, CONSTRAINT `comment_ibfk_2` FOREIGN KEY (`userID`) REFERENCES `users` (`userID`)) 

通常どの何とか固定する、テーブルを削除する手段を修正します私はそれらを再投入しなければならないので、より多くの問題を引き起こします。

+1

あなたが試したこととそれがどうなっているかを示してくださいあなたに間違っている。このサイトはコードを書くのではなく、特定の質問に答えるためのサイトです。 – miken32

+0

私はユーザがログインしていると仮定し、その効果のために何かを '$ _SESSION'に保存したと仮定します。 (a)_そこに何を保管していますか? (b)ユーザがログインしている場合、なぜすべての行にユーザ名を表示したいのですか?(c)ユーザにフィルタをSQLに組み込んだことがありますか? – Manngo

+1

SQL文を提案する:(a)名前が正常で、正常に動作している場合は、表や列の名前の前後にバックティックが必要ない。キーワードや空白を含む名前のような厄介な名前の周りにそれらが必要なだけです。 (b)PHPは、複数行の文字列を分割する必要はありません。文字列の途中に改行があれば、その文字列の一部になります。一方、JavaScriptでは、伝統的な文字列で必要となりますが、これはJavaScriptではありません。 – Manngo

答えて

0

まず、セッションに格納されたデータを取得するには、スクリプトの先頭にsession_start()が必要です。また、セッションを使用するときはいつでもsession_start()を持たなければなりません。

コードでは、逆のことがあります。別の方法ではなく、セッションに初期化されていない変数を割り当てようとしています。

session_start(); 
if (isset($_SESSION['username']) && !empty($_SESSION['username'])) { 
    $username = $_SESSION['username']; 
    $sqlinsert = "INSERT INTO comment (username, comment, dCpuID) VALUES ('$username', '$comment', '1')"; 
    // etc. 
} else { 
    // There was no username in session. 
} 

セッション変数を別の変数に格納する理由はありませんが、私はあなたの間違いを説明するためにそれを含めました。あなたは持っている:

$_SESSION['username'] = $username; 

ボーナスポイントを:あなたはbind parametersを使用して直接ではなく、SQL文に値を補間する必要があります。パラメータをバインドすると、mysqli_real_escape_stringでコメントをエスケープする必要はありません。

エラーメッセージも表示されません。むしろより:あなたは外部結合を維持したい場合はLEFT JOIN x.... WHERE x =...INNER JOIN x...

と同じであることを

echo "ERROR: Could not able to execute $sqlinsert . " . mysqli_error($conn); 
+0

セッション開始が上にあります。このビットには含まれていません。ちょっと試してみてください、ありがとう:) – danw20

+0

私は同じページに2つの異なる質問があります、1つはコメント表示、もう1つはindert関数、問題ないですか?彼らはどちらも異なるクエリ変数を持っています。一つはsqlinsert、もう一つはsqlです。 – danw20

+0

実際のコードと実際の診断情報を提供していない場合は、デバッグを手助けすることは不可能です。私はあなたのコードでいくつかの明白なエラーを指摘しました。それより多くのエラーがある場合は、私が提供しなかったコードからそれらを診断することはできません。 – gview

0

注意、あなた:

echo "ERROR: Could not able to execute $sql. " . mysqli_error($conn); 

あなたが使用される実際の変数名を含むべきです

" 
SELECT u.username 
    , c.comment 
    , c.timestamp 
    FROM users u 
    LEFT 
    JOIN comment c 
    ON c.userID = u.userID 
    AND c.dCpuID = 1; 
"; 
関連する問題