تعمل شركة PDO بشكل مختلف في استعلامين متشابهين جدًا

StackOverflow https://stackoverflow.com/questions/1439696

  •  10-07-2019
  •  | 
  •  

سؤال

كتلة التعليمات البرمجية التالية تعمل بشكل جيد (بدون أخطاء)

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

يعطي ما يلي:خطأ فادح:استدعاء دالة عضو bindParam() على كائن غير موجود في /file.php على السطر 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.

الآن هذا غريب.

على جهازي المحلي ومضيفي البعيد، لم تكن هذه مشكلة على الإطلاق.

تظهر هذه الأخطاء فقط في شركة الاستضافة الجديدة التي أحاول تجربتها خلال الشهر.هل يمكن أن يكون معلمة التكوين عندما قاموا بتجميع PHP؟

--------يحرر--------وبينما كنت لا أزال أحاول معرفة ما هو الخطأ، اكتشفت ذلك.

$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>'; 

على الخادم، وأحصل على

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
        )

)

ايهم صحيح.يقول 4 صفوف تم إرجاعها ويعرض مصفوفة النتائج.على خادم آخر ومع ذلك، أحصل على

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
        )

)

وبالتالي، يبدو أيضًا أن PDOStatement::rowCount() لا يعمل على خادم ولكنه يعمل على خادم آخر.

هل كانت مفيدة؟

المحلول 2

وجدت حلا للمشكلة.

هذه هي كتلة التعليمات البرمجية بأكملها ..

// 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);

لذلك لسبب ما، لا بد لي من إنشاء مثيل جديد لشركة تنمية نفط عمان.والأمر الغريب هو أنه على خادمين آخرين، لا يتعين علي القيام بذلك.

وبعد مزيد من البحث، وجدت أن PDO::Prepare يثير PDOExeption.

ها هو:

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.
)

ربما سوف يساعد شخص ما في المستقبل :)

نصائح أخرى

اقرا هذا: بيان $->إغلاق المؤشر ()

يحرر PDOStatement:: CloseCursor() الاتصال بالخادم بحيث يمكن إصدار عبارات SQL أخرى

هل تستخدم نفس قاعدة البيانات على الخادم حيث تقول أنه ليس لديك هذه المشكلة؟

هل $email غير محدد؟يمكنك تجربة var_dump($email) أيضًا لمعرفة ما يقوله.حظ سعيد.

هل حاولت وضع $email= الخط الموجود أسفل bindParam (ولكن قبل أن تفعل التنفيذ)؟ bindParam يمرر المعلمة حسب المرجع حتى تتمكن من التنفيذ كاستعلام وتغيير قيمة المتغير والتنفيذ مرة أخرى.

أعتقد أنه من المحتمل أن يكون خطأ في إعداد PHP.لقد سمعت أشخاصًا يقولون إن PDO كان بها الكثير من الأخطاء قبل PHP 5.3، لذا ربما ترى ما إذا كان بإمكانك تحديث PHP إلى الإصدار الأحدث؟

هل حاولت أيضًا تبديل الاستعلامين؟ربما ينكسر شيء ما بعد تشغيل استعلام واحد.

من الأفضل أن أوصي باستخدام هذا:

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

ليست هناك حاجة لاستخدام BindParam هنا.

لقد واجهت نفس المشكلة مع صدى "صفوف":" .$statement->rowCount();

حصلت على -1 الصفوف، لول.قاعدة البيانات الخاصة بي هي Informix والبحث عن الويب ، لقد وجدت أن RowCount () ؛تقوم بإرجاع الصفوف المتأثرة فقط في عبارة DELETE أو INSERT أو UPDATE التي يتم تنفيذها بواسطة كائن PDOStatement المطابق.

باستخدام عبارة محددة ، تحتاج إلى استخدام بيانات الدالة $-> fetchColumn () ؛

اقرأها هنا: http://www.phpbuilder.com/manual/en/function.pdostatement-rowcount.php

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top