PHP / PDO:如果列= 0,则无效?

时间:2014-09-30 11:29:37

标签: php mysql pdo

如果我们认识艺术家(基于唯一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,这意味着:没有错误。)

你知道问题的来源吗?

3 个答案:

答案 0 :(得分:0)

documentation州:

  

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
}