0

以下のコードを試してみると、望ましい結果が得られるので、少し混乱しています。

   include_once('config.class.php');
   $db = Core::getInstance();     
   $whr = 'test@nannex.com';

  $inv = $db->dbh->prepare("SELECT * FROM ruj_users WHERE email=:whr");
  $inv->execute(array(":whr"=>$whr));
  $row = $inv->fetch(PDO::FETCH_ASSOC);
    echo $row['email'];
    echo $row['full_name'];

ただし、次のコードを実行すると、目的の結果ではなく 1 が返されます。

     include_once('config.class.php');
     $db = Core::getInstance();     
     $whr = 'test@nannex.com';    

     function fetchUser($whr){  
    $db = Core::getInstance();              
    $inv = $db->dbh->prepare("SELECT * FROM ruj_users WHERE :whr");
            $inv->execute(array(':whr'=>$whr)); 
    $res = $inv->fetch(PDO::FETCH_ASSOC);
    return $res;
}
    $row = fetchUser("email = '".$whr."' "); 
    echo $row['email'];
    echo $row['full_name'];
4

2 に答える 2

1

関数のクエリにエラーがあります:

$inv = $db->dbh->prepare("SELECT * FROM ruj_users WHERE :whr");

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

$inv = $db->dbh->prepare("SELECT * FROM ruj_users WHERE email=:whr");

編集:列名も渡したい場合は、関数に別の変数を追加する必要があります。

function fetchUser($column, $value) {

準備されたステートメントでバインドできるのは値のみであることに注意してください。列変数は、次のように、SQL インジェクションとクエリでのハードコードを回避するためにホワイトリストと照合する必要があります。... WHERE $column = :whr ...

于 2012-12-11T23:53:49.747 に答える
1

このクエリ:

SELECT * FROM ruj_users WHERE :whr

拡張時:

SELECT * FROM ruj_users WHERE 'email = \'test@nannex.com\''

email = \'test@nannex.com\'は MySQL によってブール値として評価され、常に真であるため、 のすべての行が返されruj_usersます。

カスタム条件が必要な場合は、次のようにすることができます。

function fetchUser(array $conditions)
{
    // ...
    $sql = 'SELECT * FORM ruj_users WHERE';
    $params = array();
    foreach ($conditions as $column => $value) {
        if (preg_match('/^[a-z]+$/', $column)) {
            $sql .= "`$column` = ?";
            $params[] = $value;
        }
    }
    $inv = $db->dbh->prepare($sql);
    $inv->execute(array_values($params));
    // ...
}

fetchUser(array(
    'email' => 'test@nannex.com',
    'status' => 23,
));
于 2012-12-11T23:56:13.307 に答える