2

この質問の仕方がよくわからないので、事前にお詫びします。何かを知る必要がある場合は、反対票を投じるのではなくコメントしてください。編集します。

メインページにティーザーリンクがあり、クリックすると記事全体のウィンドウが開きます。現在、MySQLコードをPDOに変換していますが、少し行き詰まっています。

MySQLでは、以前は次のことを行っていました(ここでは、$ foo_queryは最初のページからのクエリです)。

$id = $_GET['id'];

$sql = "SELECT id, postdate, title, body FROM FooBarTable WHERE id = $id";
if ($foo_query = mysql_query($sql)) {
    $r     = mysql_fetch_assoc($foo_query);
    $title = $r["title"];
    $body  = $r["body"];
}

これは私には簡単に理解できます。私は自分が知っていることを使ってこれを変換しようとしてきましたが、あまり知らないことがわかりました。これまでのところ、私は次のものを持っています:

$id = $_GET['id'];

$sql = $DBH->prepare("SELECT id, postdate, title, body FROM FooBarTable WHERE id = :id OR id = $id");
$sql->bindParam(':id', $_REQUEST['id'], PDO::PARAM_INT);
if ($foo_query = $DBH->query($sql)) {
    $r->setFetchMode(PDO::FETCH_ASSOC);
    $r     = $foo_query->fetch();
    $title = $r["title"];
    $body  = $r["body"];
}
$sql->execute();

これにより、「PDO :: query()はパラメータ1が文字列であると想定している」というエラーが発生します。これは「if」行用です。

そのPDOのいずれかを正しく書いたことはありますか?ここから何をする必要がありますか?友人が最近MySQLを教えてくれましたが、彼はPDOをまったく知らないので、私は彼のアドバイスを求めることができません(それほど役に立ちません...)

4

4 に答える 4

5

これは正しい方法であり、コメントがあります。

try {
    //Connect to the database, store the connection as a PDO object into $db.
    $db = new PDO("mysql:host=localhost;dbname=database", "user", "password");

    //PDO will throw PDOExceptions on errors, this means you don't need to explicitely check for errors.
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    //PDO will not emulate prepared statements. This solves some edge cases, and relives work from the PDO object.
    $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

    //Prepare the statement.
    $statement = $db->prepare("SELECT id, postdate, title, body FROM FooBarTable WHERE id = :id");
    //Bind the Value, binding parameters should be used when the same query is run repeatedly with different parameters.
    $statement->bindValue(":id", $_GET['id'], PDO::PARAM_INT);
    //Execute the query
    $statement->execute();

    //Fetch all of the results.
    $result = $statement->fetchAll(PDO::FETCH_ASSOC);
    //$result now contains the entire resultset from the query.
}
//In the case an error occurs, a PDOException will be thrown. We catch it here.
catch (PDOException $e) {
    echo "An error has occurred: " . $e->getMessage();
}
于 2012-10-05T19:50:59.347 に答える
2

PDOStatement::execute代わりに使用する必要がありますPDO::query

$foo_query = $sql->execute();

呼び出し時にすべてのパラメータを一度にバインドすることもできますexecute

$foo_query = $sql->execute(array(
    ':id' => $id
));
于 2012-10-05T19:40:39.687 に答える
1

次のように変更する必要があります。

$sql->execute();
if($r = $sql->fetch()) {
    $title = $r["title"];
    $body = $r["body"];
于 2012-10-05T19:41:13.063 に答える
1

これを試して:

$sql = $DBH->prepare("SELECT id, postdate, title, body 
  FROM FooBarTable WHERE id = :id OR id = $id");
$sql->bindParam (':id', $_REQUEST['id'],PDO::PARAM_INT);
$sql->execute();

while($row = $sth->fetch(PDO::FETCH_ASSOC)) {
  $title = $row["title"];
  $body = $row["body"];
}
于 2012-10-05T19:45:42.887 に答える