如果我们认识艺术家(基于唯一ID),我有一个非常简单的功能来检查数据库,如果是这样的话,我想收集他的信息:
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已知且另一个名为“last_tweet”(INT50)的colmun等于0,则PDO会找到1个结果并填充$ KnownArtiste。 现在,如果IDArtiste已知但是colum“last_tweet”!= 0则PDO不会找到任何结果(并且errorInfo()等于0000,这意味着:没有错误。)
你知道问题的来源吗?
答案 0 :(得分:0)
PDO :: query()在单个函数调用中执行SQL语句, 返回语句返回的结果集(如果有)作为 PDOStatement对象。
这意味着,如果没有匹配,则不返回任何行!
答案 1 :(得分:0)
直接从PHP PDOStatement::rowCount页面引用:
PDOStatement :: rowCount()返回受影响的行数 最后由相应的DELETE,INSERT或UPDATE语句执行 PDOStatement对象。
如果关联的PDOStatement执行的最后一条SQL语句是 一个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();
}
}
答案 2 :(得分: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
}