0

PDO と PHP で値をバインドするのに少し問題があります。値を変数に置き換えると、スクリプトは適切な結果を返しますが、何らかの理由でこれを機能させることができません。

// Connect to database in function on different page
function db1() {
    try {
        $pdo = new PDO("mysql:host=localhost;dbname=**********", '**********', '**********');
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
        return $pdo;
        $pdo = null;
    } catch (PDOException $e) {
        die($e->getMessage());
    }
}

// Scrit with problems
$db = db1();
$query = $db->prepare("SELECT column1, column2, column3, column4 FROM table_name WHERE (column4=2 OR column4=3) AND column5=:col1 AND column6=:col2"); // Prepare the statement to prevent any SQL injection
    $query->bindValue(':col1', $var1, PDO::PARAM_INT);
    $query->bindValue(':col2', $var2, PDO::PARAM_STR);
    $query->execute();
// I also tried the following.
// $query->execute(array(':col1' => $var1, ':col2' => $var2));

// Fetch result row
$row = $query->fetch(PDO::FETCH_ASSOC);

何か案は?


UPDATE クエリの前後に var_dump を実行しました。var1 = 文字列(1) "2" および var2 = 文字列(1) "1"

$pdo = null; を削除しました。

4

1 に答える 1

0

$pdo = nulla の後にあるreturnため実行されない行と、関数が変数として使用されている行を除いて$db = $db1()、コードには明らかな問題はありません。あなたはバインディングを変数に置き換えると言うので、最後はタイプミスだと思います。

そのため、スクリプトのその時点でのとvar_dumpの値を試してみることをお勧めします。$var1$var2

アップデート

このようにセットアップを複製しました

<?php

    $db = new PDO("mysql:host=localhost;dbname=test");
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $var1 = 1; // See answer text below
    $var2 = 2;

    $query = $db->prepare("SELECT * FROM test WHERE column5=:col1 AND column6=:col2");
    $query->bindValue(':col1', $var1, PDO::PARAM_INT);
    $query->bindValue(':col2', $var2, PDO::PARAM_STR);
    $query->execute();
    $row = $query->fetch(PDO::FETCH_ASSOC);
    print_r($row);
?>

次に、このような最初のテーブルを作成しました

CREATE TABLE test ( column5 INTEGER, column6 INTEGER );

そして、このように

CREATE TABLE test ( column5 varchar(5), column6 varchar(5) );

$var1andを$var21,2 (整数) および "1","2" (文字列) として定義してみました。

つまり、出力として単一の行を取得することを期待していましたが、次のようにしました。

Array
(
   [column5] => 1
   [column6] => 2
)

この時点で残っている唯一の可能性は、データベースのコンテンツに何か奇妙なものがあると思います。

したがって、あなたのシステムで以下のテストが機能しない、つまり目的の行が返されないことも期待しています。

$query = $db->prepare("SELECT column1, column2, column3, column4 FROM table_name WHERE (column4=2 OR column4=3) AND column5=2 AND column6='1'");
$query->execute();
$row = $query->fetch(PDO::FETCH_ASSOC);
var_dump($row);
于 2012-10-11T18:09:31.577 に答える