2011-04-09 9 views
1

私は自分のウェブサイト上のプロファイルにコメントすることを許可しようとしています。私はPHPを以下している -更新:ユーザーのコメントを取得するPHPを使用してMysqlから

<?php 
// Insert Comments into Database that user provides 
$comm = mysql_real_escape_string($_POST['addComment']); 
$pID4 = filter_input(INPUT_GET, 'pID', FILTER_SANITIZE_NUMBER_INT); 
$cID = mysql_real_escape_string($_POST['courseInfoDD']); 
     $username = "###"; 
     $password = "####"; 
     $pdo4 = new PDO('mysql:host=localhost;dbname=###', $username, $password); 
     $pdo4->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
$sth3 = $pdo3->prepare(' 
     INSERT INTO Comment (info, pID, cID) 
     VALUES(:info, :pID, :cID) 
      '); 
$sth3->execute(array(
      ':info' => $comm, ':pID' => $pID3, ':cID' => $cID 
     )); 
?> 

DB表 "コメント" http://postimage.org/image/16sbr0jd0/(司会これは、画像を表示してくださいに変換してください)

HTML:

<input type='text' id='addComment' name='addComment' tabindex='3' value='Enter comment' /> 

エラーが発生しました:

No pID specified。コメントを挿入しようとしたとき。

答えて

0

一重引用符文字列の$変数は処理されていません。代わりに二重引用符を使用して、SQL文自体に引用符を追加してください。

$sth3 = $pdo3->prepare(" 
     INSERT INTO Comment (info, pID, cID) 
     VALUES('$comm', '$pID3', '$cID') 
      "); 
+0

プリペアドステートメントを使用していることを考慮して、値をクエリに挿入しないでください。代わりに、ステートメントを実行するときにバインドする必要があります。 –

+0

改訂コードをご覧ください。 – Jshee

0

私たちの問題は、コメントではなくmysqlで何もしません。

基本的なPHP文字列の構文です。

変数を文字列で解釈する場合は、二重引用符を使用します。

ただし、直接クエリに変数を追加するべきではなく、彼らにこのように使用されなければならないPDO準備されたステートメントに

+0

これをテストすれば、pIDは呼び出されません。 – Jshee

1

パラメータビン:

$sth3 = $pdo3->prepare(' 
     INSERT INTO Comment (info, pID, cID) 
     VALUES(:info, :pID, :cID) 
      '); 
$sth3->execute(array(
      ':info' => $comm, ':pID' => $pID3, ':cID' => $cID 
     )); 

まず「スロットは設定を"を入力し、クエリを実行するときに値を指定します。あなたのINSERT文で単一引用符を使用している

+0

これを試してコメントを投稿しようとすると、「教授」の「pID」が見つからないというエラーが表示されます。これをクエリ 'WHERE pID =?'に追加する必要があります。 ? – Jshee

+0

@ user700070:いいえ、挿入には使用されません。 '/addcomment.php?pID = 3'のように、pIDはURLのGET変数の一部でなければなりません。 – Kaivosukeltaja

+0

これはまだKaivosukeltajaを働いていません – Jshee

4

これらの単純な引用符で
$sth3 = $pdo3->prepare(' 
    INSERT INTO Comment (info, pID, cID) 
    VALUES($comm, $pID3, $cID) 
'); 

$commを評価されません - とリテラル$comm文字列は、データベースに送信されます - 結果あなたはおそらくあまり期待していないものである。


変数を補間する場合は、double-quotes around your stringを使用してください。

しかし、準備文を使用しようとしているので、これは実際に行うべきことではありません。です。

代わりに、ステートメントにプレースホルダを使用し、ステートメントを実行するときにそれらのデータをデータにバインドする必要があります。


あなたprepareは、このようなビットに見えるだろう、私は考えます:

$sth3 = $pdo3->prepare(' 
    INSERT INTO Comment (info, pID, cID) 
    VALUES(:comm, :pID3, :cID) 
'); 

:comm:pID3、そして:cIDプレースホルダ。

そして、文を実行するときに、あなたが実際にプレースホルダに対応するために、いくつかの実際のデータを渡します: ':COMM'

$ sth3->(配列( 実行=> $のCOMMを、 ':pID3' => $ pID3, ':cID' => $ cID、 ));


追加注:プリペアドステートメントを使用しているとして、あなたはmysql_real_escape_string()を使用する必要はありません(ちなみに、PDO関連の機能ではない、とmysql_*機能で作業する場合にのみ使用されるべきです):エスケープ処理は、準備されたステートメントのメカニズム自体によって処理されます。

+0

更新されたコードを見てください。この '準備'メソッドは、 '$ pID3 = filter_input(INPUT_GET、' pID '、FILTER_SANITIZE_NUMBER_INT);行のpIDを取得していないようです。 $ pID3はvarとして準備されています。 – Jshee

+0

これはpIDを取得していないのですか? – Jshee

関連する問題