PDO empy результат из SELECT при использовании AND - PullRequest
1 голос
/ 02 апреля 2010

Я натолкнулся на довольно интересную вещь, которую не могу понять сам. Каждый раз при выполнении оператора SQL, который содержит '... AND ...', результат будет пустым.

Пример:

echo('I have a user: ' . $email . $wachtwoord . '<br>');

$dbh = new PDO($dsn, $user, $password);

$sql = 'SELECT * FROM user WHERE email = :email AND wachtwoord= :wachtwoord';
$stmt = $dbh->prepare($sql);
$stmt->bindParam(:email,$email,PDO::PARAM_STR);
$stmt->bindParam(:wachtwoord,$wachtwoord,PDO::PARAM_STR);

$stmt->execute();

while($row = $stmt->fetchObject())
{   
  echo($row->email . ',' . $row->wachtwoord);
  $user[] = array(
    'email' => $row->email,
    'wachtwoord' => $row->wachtwoord
  );
}

Первый эхо-сигнал отображает правильные значения, однако строка с

echo($row->email . ',' . $row->wachtwoord);

никогда не достигается. Несколько вещей, которые я хочу добавить: 1) Я подключен к базе данных, так как работают другие запросы, только те, где я добавляю «И» после моего «ГДЕ не удается». 2) Работа с , в то время как отлично работает с запросами, которые не содержат '... AND ...' 3) Отчет об ошибках включен, PDO не дает исключений по моему запросу (или что-то еще) 4) Выполнение запроса непосредственно в базе данных дает то, что я хочу:

SELECT * FROM user WHERE email = 'jurgen@email.com' AND wachtwoord = 'jurgen'

Я могу смотреть на это снова целый день (что я уже делал однажды, но мне удалось обойти «И»), но, возможно, один из вас может помочь мне.

Заранее спасибо.

Jurgen

Ответы [ 2 ]

0 голосов
/ 02 апреля 2010
while($row = $stmt->fetchObject()){}

Разве эта строка не должна быть (в зависимости от ваших настроек)?

while( $row = $stmt->fetchAll( PDO::FETCH_OBJ) ){

var_dump( $row ) ;

}
0 голосов
/ 02 апреля 2010

Посмотрим, будет ли один из этих отладочных запросов

.
....
$dbh = new PDO($dsn, $user, $password);

function debugQuery($dbh, $querystring, $params) {
  $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);  
  $stmt = $dbh->prepare($querystring);
  $stmt->execute($params);
  echo $querystring, ":<br />\n";
  while ( false!== ($row=$stmt->fetch(PDO::FETCH_ASSOC)) ) {
    echo '  ', join(', ', $row), "<br />\n";
  }
}

debugQuery($dbh, 'SELECT Count(*) as c FROM user', array());
debugQuery($dbh, 'SELECT Count(*) as c FROM user WHERE email=?', array($email));
debugQuery($dbh, 'SELECT Count(*) as c FROM user WHERE wachtwoord=?', array($wachtwoord));
debugQuery($dbh, 'SELECT Count(*) as c FROM user WHERE email=? AND wachtwoord=?', array($email, $wachtwoord));
debugQuery($dbh, 'SELECT Count(*) as c FROM user WHERE email LIKE ? AND wachtwoord LIKE ?', array( '%'.trim($email).'%', '%'.trim($wachtwoord).'%'));

$sql = 'SELECT * FROM user WHERE email = :email AND wachtwoord= :wachtwoord';
$stmt = $dbh->prepare($sql);
...

возвращает что-то интересное.

edit: Не похоже ... тогда давайте атаковать это под другим углом

$email = 'emailA';
$wachtwoord = 'wachtwoordA';
echo('I have a user: ' . $email . $wachtwoord . '<br>');

//$dbh = new PDO($dsn, $user, $password);
$dbh = new PDO("mysql:host=localhost;dbname=test", 'localonly', 'localonly'); 
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

// create a temporary table
$dbh->exec('CREATE TEMPORARY TABLE tmp_user ( id int auto_increment, email varchar(32), wachtwoord varchar(32), primary key(id))');
// and fill in exactly the record we're looking for
$dbh->exec("INSERT INTO  tmp_user (email, wachtwoord) VALUES ('$email', '$wachtwoord')");


$sql = 'SELECT * FROM tmp_user WHERE email = :email AND wachtwoord= :wachtwoord';
$stmt = $dbh->prepare($sql);
$stmt->bindParam(':email', $email,PDO::PARAM_STR);
$stmt->bindParam(':wachtwoord', $wachtwoord,PDO::PARAM_STR);

$stmt->execute();

while($row = $stmt->fetchObject())
{   
  echo($row->email . ',' . $row->wachtwoord);
  $user[] = array(
    'email' => $row->email,
    'wachtwoord' => $row->wachtwoord
  );
}

печатает I have a user: emailAwachtwoordA<br>emailA,wachtwoordA на моей версии php / mysql.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...