2014-09-30 6 views
0

У меня есть очень простая функция для проверки в БД, если мы знаем, художник (на основе уникального идентификатора), и если это так, то я хочу, чтобы собрать его Infos:PHP/PDO: нет результата, если столбец = 0?

function isArtistKnown($id_artist){ 
    global $pdo; 

    $isKnownQuery = $pdo->query("SELECT * FROM artistes WHERE IDArtiste = '$id_artist'"); 
    if($isKnownQuery->rowCount() > 0){ 
     $KnownArtiste = $isKnownQuery->fetch(PDO::FETCH_OBJ); 
     return $KnownArtiste; 
    }else{ 
     return $isKnownQuery->errorInfo(); 
    } 
} 

Проблема заключается в следующем:

Если IDArtiste известен и другой colmun называется «last_tweet» (INT50) равен 0, то PDO находит 1 результат и $ KnownArtiste заполнена. Теперь, если IDArtiste известен, но Колум „last_tweet“! = 0 то PDO не находит никакого результата (и errorInfo() равно 0000, что означает: отсутствие ошибки).

У вас есть идея, где проблема?

+3

Это означает, что ничто не соответствует Вашему условию, нет строк вернулся! – senK

+0

Вы используете тот же запрос в другом mysql-клиенте? (Также может показаться подозрительным не сбегать от $ id_artist, и я предполагаю, что это целое число и не нужно использовать '' '' цитаты, вы также можете просмотреть подготовленные заявления. – johannes

+0

@senk Я подтверждаю, что есть совпадение. IDArtiste остается неизменным, и он является единственным в SQL-состоянии. – Cyc

ответ

0

В documentation состояния:

PDO :: запроса() выполняет инструкцию SQL в вызове одной функции, возвращения результирующего набора (если таковые имеются) возвращенное заявление в качестве объекта PDOStatement ,

Это означает, что если нет совпадений, он не возвращает строк!

0

Цитирование непосредственно со страницы PHP PDOStatement::rowCount:

PDOStatement :: ROWCOUNT() возвращает количество строк, затронутых в последней DELETE, INSERT или UPDATE заявления, выполняемых с помощью соответствующего объекта PDOStatement.

Если последний оператор SQL, выполняемый ассоциированным PDOStatement, был инструкция SELECT, некоторые базы данных могут возвращать количество строк , возвращенных этим оператором. Однако это поведение не гарантируется для всех баз данных и не должно полагаться на переносные приложения .

Вы не можете использовать rowCount с SELECT. Используйте вместо этого:

function isArtistKnown($id_artist){ 
    global $pdo; 
    //If you don't use prepared statements, a kitten and a puppy die somewhere 
    $isKnownQuery = $pdo->prepare("SELECT * FROM artistes WHERE IDArtiste = :ida"); 
    $isKnownQuery->bindValue(':ida', $id_artist); 
    $isKnownQuery->execute(); 
    $KnownArtiste = $isKnownQuery->fetch(PDO::FETCH_OBJ); 
    if(isset($KnownArtiste->IDArtiste)){ 
     return $KnownArtiste; 
    }else{ 
     //Actually, in this case there's no error, just no artist 
     //so i'd use 
     return null; 
     //instead of 
     //return $isKnownQuery->errorInfo(); 
    } 
} 
+0

Вы правы, подготовленные заявления лучше. Однако проблема одна и та же: 1 совпадение, если «last_tweet» = 0. Нет совпадения, если «last_tweet»! = 0 Конечно, IdArtiste всегда один и тот же, я не меняю его, когда я пытаюсь использовать разные значения 'last_tweet' , – Cyc

+0

Мне нужно увидеть фактические данные в вашей таблице, потому что last_tweet не имеет никакого отношения в запросе, который вы опубликовали. –

+0

Столбец last_tweet равен '0' по умолчанию или метке времени. – Cyc

0

Если вы собираетесь вернуться errorInfo() он всегда будет содержать данные, есть ли ошибка или нет. Вы должны возвращать дружественное сообщение пользователя заявить, что нет ни одной строки, найденной (художник не известен вам)

function isArtistKnown($id_artist){ 
    global $pdo; 

    $isKnownQuery = $pdo->query("SELECT * FROM artistes WHERE IDArtiste = '$id_artist'"); 
    if ($isKnownQuery->rowCount() === 0){ 
     return false; 
    } 
    $KnownArtiste = $isKnownQuery->fetch(PDO::FETCH_OBJ); 
    return $KnownArtiste 
} 

и проверок:

$Validate = isArtistKnown(0); 
if ($Validate === false){ 
echo "Artist is Not Known"; 
}else{ 
//Work with your data 
} 
+0

rowCount не может использоваться с операторами выбора. См. Http://php.net/manual/en/pdostatement.rowcount.php –

Смежные вопросы