php - 添加到数组和循环变量

时间:2014-11-02 17:31:01

标签: php mysql sql pdo

我有一个循环遍历一组数据的脚本,并在执行此操作时调用函数:

$d = $dbh->prepare("
    SELECT  * 
    FROM    xeon_users_rented 
    WHERE   since       <= unix_timestamp(CURRENT_TIMESTAMP - INTERVAL 14 day) 
        AND clicks_last <= unix_timestamp(CURRENT_TIMESTAMP - INTERVAL 14 day)
");
$d->execute();

$rows      = $d->fetchAll(PDO::FETCH_ASSOC);
$new_array = array();

foreach ($rows as $data ) {
     $new_array[]      = $data['id'];
     $userToRecycleFor = $data['user_by'];
     $outcome          = $rentedrefs->_recycleMulti(
                            0,
                            $userToRecycleFor,
                            $new_array,
                            1
                        );
}   

这是我的函数_recycleMulti();

function _recycleMulti($ceny, $referer, $recycle_array, $free=false){
    global $dbh;
    $this->ceny['rec'] = $ceny;

    $totalrecycle = count($recycle_array);
    $koszyk       = $this->ceny['rec'] * count($recycle_array);

    $referer_sql = $dbh->prepare("
        SELECT  * 
        FROM    `users` 
        WHERE   `username` = :referer 
        LIMIT   1;
    ");

    $referer_sql->bindParam(':referer', $referer);

    try {
        $referer_sql->execute();
    }
    catch (PDOException $e) {
        _OP_ERROR($e->getMessage(), __FILE__, __LINE__);
    }

    $referer_dane        = $referer_sql->fetch();
    $referer_dane_accont = $referer_dane['membership'];



    for( $i = 0; $i < count($recycle_array); $i++ ){

        # Expires
        $recycle_sql = $dbh->prepare("
            SELECT  *   
            FROM    `users_rented` 
            WHERE   `id` = :id 
            LIMIT   1;
        ");

        $recycle_sql->bindParam(':id', $recycle_array[$i]);
        $recycle_sql->execute();
        $recycle = $recycle_sql->fetch();

        echo "row count:";
        echo $recycle_sql->rowCount();

        if( $recycle_sql->rowCount() == 0 ){
            return false;
        }

        if( ! $recycle_sql 
            || ( $recycle_sql->rowCount() == 0 ) 
            || $recycle['user_by'] != $referer_dane['username'] ){
            return false;
        }
        return true;
    }

现在,我的问题是,它运行的功能很好。虽然它只是第一次运行,但它确实有效。我添加了这个:

echo "row count:";
echo $recycle_sql->rowCount();

这就是结果:

row count:1row count:0row count:0row count:0row count:0row count:0row count:0row count:0row count:0row count:0row count:0row count:0row count:0row count:0row count:0row count:0row count:0row count:0row count:0

正如您所看到的,只有在第一次运行时,才会有一个有效的行。

我做错了什么?

1 个答案:

答案 0 :(得分:1)

documentation of rowCount()

中的解释是正确的
  

如果关联的PDOStatement执行的最后一条SQL语句是   一个SELECT语句,一些数据库可能会返回行数   由该声明返回。但是,不保证这种行为   适用于所有数据库,不应依赖于便携式数据库   应用

换句话说,rowCount()不会提供您的代码是否有效的任何信息。

要检查您的查询是否成功,请检查execute()fetch()的返回值,两者都会在失败时返回false。在后一种情况下,请务必使用===进行比较以匹配类型。此外,如果查询失败,函数会抛出包含其他信息的异常。检查the examples for fetch()如何处理这些例外。

除此之外,您根本没有使用$recycle中的结果。