0

PDOを使用してPHPとmysqlから値を選択する関数をphpとmysqlで作成しようとしています

function getRec($id=0)
{
    ($id==0?$addQuery="":$addQuery=" where id =".$id);
    $statement = $dbh->prepare("select * from TCMS :name order by id");
    $statement->execute(array(':name' => $addQuery));
    $row = $statement->fetchAll(); 
    return $row ;
} 

エラーが発生しました

致命的なエラー:キャッチされない例外'PDOException'とメッセージ'SQLSTATE [42000]:構文エラーまたはアクセス違反:1064SQL構文にエラーがあります。/ Applications / XAMPP / xamppfiles/htdocの1行目でid=2'order by id'の近くで使用する正しい構文については、MySQLサーバーのバージョンに対応するマニュアルを確認してください。

実際に私が試していること

IDの値(2)が渡されると、ステートメントは次のようになります。

select * from TCMS where id=2 order by id

また、ID = 0の場合、selectステートメントは次のようになります。

select * from TCMS order by id

私はPDOを初めて使用し、正確な構文がわかりません。

これを行う方法 ?

4

2 に答える 2

3

代わりにこれを行ってください:

function getRec($id=0)
{
    //($id==0?$addQuery="":$addQuery=" where id =".$id);
    if ($id == 0)
    {
        $statement = $dbh->prepare("select * from TCMS order by id");
        $statement->execute();
    }
    else
    {
        // Notice the SQL string has changed. Placeholder :name now properly takes the place of a SQL value.
        $statement = $dbh->prepare("select * from TCMS where id = :name order by id");
        $statement->execute(array(':name' => $id));
    }

    $row = $statement->fetchAll(); 
    return $row ;
}

間違っているのは、プレースホルダーを任意の文字列値としてSQLをバインドして実行しようとしていることです。これは、プレースホルダーの目的ではありません。

プレースホルダーは、値(テーブル名などではない)の代わりに設定する必要があります。これにより、実行中に渡された値がPDOによって適切に処理され、正しくエスケープされます。

私が書いた関数は、有効なSQLを作成するのに役立つはずです。

于 2012-11-11T13:23:58.817 に答える
2

WHERE句 を動的に追加する必要がある場合は、最初にSQL文字列を作成してから作成しますprepare()。パラメータを追加するための条件が満たされた場合は、に渡された配列に適切なプレースホルダー/値のペアを条件付きでexecute()追加する必要があります。

プレースホルダーを任意のSQL文字列としてバインドすることはできません。

// Array to pass into execute()
$values = array();

// Start your SQL...
$sql = "SELECT * FROM TCMS";
// Add the WHERE clause if $id is not zero
if ($id !== 0) {
   $sql .= " WHERE id=:name ";
   // And add the placeholder into the array
   $values[':name'] = $id);
} 
// add the ORDER BY clause
$sql .= " ORDER BY id";

// Prepare the statement
$statement = $dbh->prepare($sql);

$statement->execute($values);
// fetch, etc...
于 2012-11-11T13:24:19.423 に答える