0

私はこれら 2 つのテーブル comments_tbl と news_comments_tbl を持っており、MySQL を使用しています。

コメントを作成しているときに、最後に作成されたコメント ID を新しいテーブル news_comments_tbl に送信したいと考えています。

準備済みステートメントを使用する前にこのメソッドを使用していましたが、正常に機能しました。

//comment
$name     = $_POST['name'];
$comment  = $_POST['comment'];

//ID
$commentidfk  = $_POST['comments_id'];
$newsidfk     = $_POST['news_id_fk'];
$newsidfk     = $_GET['news_id_fk'];

if (isset($_POST['comment']))
{

  $sqlquery ="INSERT INTO comments_tbl(comments_id, name, comment)
  VALUES (NULL, '$name', '$comment')";
  $result = $conn->query($sqlquery) or die('Error');

  $sqlquery2 ="INSERT INTO news_comments_tbl(news_id_fk, comments_id_fk)
  VALUES ('$newsidfk', LAST_INSERT_ID())";
  $result2 = $conn->query($sqlquery2) or die('Error'); 

  header("location:news.php");

}
    else
    {
        echo 'Error';
    }

しかし、今、PDO プリペアド ステートメントを使用するように変換しているときに、それを機能させることができません。コメントは作成されますが、最後に挿入された ID を新しいテーブルに挿入できません (news_comments_tbl)

これは私がやっている方法です:

$query  = "INSERT INTO comments_tbl(comments_id, name, comment) VALUES (NULL,?,?)";

  $stmt = $conn->prepare($query);
  $stmt->bindParam(1,$name, PDO::PARAM_STR);
  $stmt->bindParam(2,$comment, PDO::PARAM_STR);

  $stmt->execute();

  return $conn->lastInsertId('comments_id');

  $query  = "INSERT INTO news_comments_tbl(news_id_fk, comments_id_fk) VALUES (?, LAST_INSERT_ID)";

  $stmt = $conn->prepare($query);
  $stmt->bindParam(1, $newsidfk, PDO::PARAM_INT);

  $stmt->execute();

  header("location:news.php");
4

2 に答える 2

3

2 番目の準備済みステートメントを実行する前に return を発行するべきではありません。前述のようにLAST_INSERT_ID、2 番目のクエリで正しく呼び出していませんが、とにかく必要ありません。コードは次のようになります。

$comments_id = $conn->lastInsertId();

$query  = "INSERT INTO news_comments_tbl(news_id_fk, comments_id_fk) VALUES (?, ?)";

$stmt = $conn->prepare($query);
$stmt->bindParam(1, $newsidfk, PDO::PARAM_INT);
$stmt->bindParam(1, $comments_id, PDO::PARAM_INT);
$stmt->execute();
于 2013-01-06T12:58:38.550 に答える
0

中括弧を忘れたようですLAST_INSERT_ID()

このようなエラーの通知を受け取るには、接続後に次のコマンドで PDO を初期化します。

$conn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
于 2013-01-06T12:14:59.890 に答える