PDO iki-çok benzer sorgular farklı davranır

6 Cevap php

Aşağıdaki kod bloğu çalışıyor (hiç hata)

$query = "select * from users where username = ?";
$statement = $sql->prepare($query);
echo gettype($statement); // -- This returns 'object'
$statement->bindParam(1, $username);

The following gives: Fatal error: Call to a member function bindParam() on a non-object in /file.php on line 39

$email = 'fake@email.com';
$query = "select * from users where email = ?";
$statement = $sql->prepare($query);
echo gettype($statement); // -- this returns 'boolean'
$statement->bindParam(1, $email); // -- this is line 39.

Şimdi bu garip.

Benim yerel makine ve benim uzak ana, bu bir sorun değildi.

Bu hatalar sadece ben ay için çalışıyorum bu yeni hosting şirketi üzerinde gösterir. Onlar php derlenmiş zaman bir yapılandırma param olabilir mi?

--------edit-------- While still trying to figure out what's wrong,I found this out.

$query = "select userID, username from users";
$statement = $sql->prepare($query);    
$statement->execute();
$r = $statement->fetchAll(PDO::FETCH_ASSOC);

// display # of rows
echo "Rows returned: " . $statement->rowCount();

// display results array
echo '<pre>'; print_r($r); echo '</pre>';

Bir sunucu üzerinde, ben olsun

Rows returned: 4

Array
(
    [0] => Array
        (
            [userID] => 1
            [username] => lyrae
        )

    [1] => Array
        (
            [userID] => 2
            [username] => jproffer
        )

    [2] => Array
        (
            [userID] => 3
            [username] => king
        )

    [3] => Array
        (
            [userID] => 4
            [username] => gergy
        )

)

Hangisi doğru. 4 satır döndü ve sonuç dizi görüntüler diyor. Başka bir sunucu üzerinde ancak ben almak

Rows returned: 0

Array
(
    [0] => Array
        (
            [userID] => 1
            [username] => lyrae
        )

    [1] => Array
        (
            [userID] => 2
            [username] => jproffer
        )

    [2] => Array
        (
            [userID] => 3
            [username] => king
        )

    [3] => Array
        (
            [userID] => 4
            [username] => gergy
        )

)

Böylece, bu PDOStatement :: rowCount () bir sever çalışmıyor da görünüyor ama başka çalışır.

6 Cevap

Soruna bir çözüm bulundu.

Bu kod tüm blok ..

// check if username exists
$query = "select * from users where username = ?";
$statement = $sql->prepare($query);
$statement->bindParam(1, $username);
$statement->execute();


// check if email exists
$sql2 = new PDO('mysql:host=localhost; dbname=db', 'username', 'pw');
$query = "select * from users";
$statement = $sql2->prepare($query);
echo gettype($statement);
#$statement->bindParam(1, $email);

Yani nedense, ben PDO yeni bir örneğini oluşturmak zorunda. ne tuhaf 2 diğer sunuculara, ben bunu yapmak zorunda kalmamasıdır.

Ve daha bakarak üzerine, i PDO :: hazırlayın bir PDOExeption yükseltir bulundu.

İşte:

SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other unbuffered queries are active. Consider using PDOStatement::fetchAll(). Alternatively, if your code is only ever going to run against mysql, you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute.

Array
(
    [0] => HY000
    [1] => 2014
    [2] => Cannot execute queries while other unbuffered queries are active.  Consider using PDOStatement::fetchAll().  Alternatively, if your code is only ever going to run against mysql, you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute.
)

Belki gelecekte birisi yardımcı olacak :)

Bu Oku: $statement->closeCursor()

Diğer SQL ifadeleri ihraç edilebilir, böylece PDOStatement :: closeCursor () sunucusuna bağlantı boşaltır

Eğer bu sorunu yok demek sunucuda aynı veritabanını kullanıyor musunuz?

$ Email tanımsız mı? Bunu ne diyor çok görmek bir var_dump ($ email) deneyebilirsiniz. İyi şanslar.

(Eğer idam mı ama önce) size bindParam aşağıda $email= satırı koyarak denediniz mi? Eğer, sorgu olarak yürütmek değişkenin değerini değiştirmek ve yeniden idam böylece bindParam referans parametre geçirir.

Ben muhtemelen hata kurmak PHP olduğunu bile düşünüyorum. Ben PDO PHP 5.3 öncesi bir sürü hata vardı söyleyerek insanları duydum, bu yüzden son sürüme kadar PHP alabilirsiniz belki görmek ettik?

Ayrıca etrafında iki sorgu takas denediniz mi? Eğer bir sorgu çalıştırdıktan sonra Belki bir şey kırar.

Ben daha iyi kullanmanızı tavsiye ederim:

$email = 'fake@email.com';
$query = "select * from users where email = ?";
$statement = $sql->prepare($query);
$statement->execute(array($email));

Hiçbir BindParam kullanımı burada gereklidir.

I had same problem with echo "Rows returned: " . $statement->rowCount();

I got -1 rows, lol. My database is INFORMIX and searching web i found that rowCount(); returns only affected rows in a DELETE, INSERT, or UPDATE statement executed by the corresponding PDOStatement object.

With a SELECT statement you need to use function $statement->fetchColumn();

buradan okuyabilirsiniz: http://www.phpbuilder.com/manual/en/function.pdostatement-rowcount.php