Alireza
3 سال پیش توسط Alireza مطرح شد
4 پاسخ

یک سوال درمورد pdo

با سلام خدمت راکتی های عزیز یک سوال درمورد pdo داشتم
من اومدم یک تغییری داخل سورس هام قرار دادم که به صورت زیره :

private static $instance;

که قراره کد زیر رو در بر بگیره :

$con = new PDO('mysql:host=' . DB_HOST . ';dbname=' . DB_NAME . ';charset=' . DB_CHARSET . ';', DB_USERNAME, DB_PASSWORD, $Options);
            self::$instance = $con;

و موقع تماس به کلاس isset قرار دادم که اگه $instance وجود داشت همون رو برگردونه و دوباره کانکشن نسازه.

بعد از اون من به خطای 2014 Cannot execute queries while other unbuffered queries are active خوردم که مربوط به fetchAll میشد یکم جستجو کردم دیدم داخل تاپیک ها گفتن بعد از fetchAll بیاید closeCursor رو اجرا کنید.

الان سوال من اینه که closeCursor دقیقا چیکار میکنه ؟ چی رو کلوز میکنه !
اگه روش بهتری سراغ دارید که باعث بشه new pdo چندبار کال نشه و چندین کانکشن ساخته نشه ممنون میشم بگید


ثبت پرسش جدید
مهران مرندی
تخصص : برنامه نویس
@mehranmarandi 3 سال پیش آپدیت شد
1

با توجه به توضیحی که در خصوص ایجاد connection و چک کردن اون دادید، به نظر میرسه کد شما به درستی جلوی ایجاد کانکشن های متعدد رو میگیره، و با توجه به خطایی هم که دریافت میکنید این موضوع مشخصه.
این خطا به اجرای unbuffered query مربوط میشه، و از اونجایی که کوئری ها بصورت پیشفرض بصورت buffered اجرا میشن حدس میزنم در اجرای کوئری اون رو غیر فعال میکنید (چیزی شبیه به کد زیر)

$pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);

و از اونجایی که کوئری بصورت unbuffered اجرا میشه، دیتابیس قبل از تمام شدن اجرای کامل کوئری و آماده شدن تمام نتایج شروع به ارسال اطلاعات به php میکند، و در ادامه کوئری دیگری اجرا میشود در حالی که هنوز کوئری اول تمام نشده است.
closeCursor که بهش اشاره کردید، اجرای کوئری اول رو در هر مرحله ای که هست متوقف میکنه تا جلو اجرای همزمان دو کوئری از یک کانکشن گرفته بشه، این ممکنه باعث بشه نتایج کوئری اول کامل دریافت نشن.
در صورتی که کوئری ها دیتای عظیمی رو جستجو نمیکنن و بصورت nubuffered اجرا میکنید لطفا اونها رو به حالت buffered اجرا کنید و نتیجه رو بگید. در غیر اینصورت کد های کوئری خودتون رو هم به اشتراک بزارید.


Alireza
تخصص : توسعه دهنده وب
@alirezax5 3 سال پیش مطرح شد
0

سلام ممنون از پاسختون , نه آپشن هایی که پاس دادم کلا ایناس :

  $Options = [
            PDO::ATTR_PERSISTENT => true,
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_EMULATE_PREPARES => false,
            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
        ];

و داخل لوکال یا همون سیستمم بدون مشکله ولی توی هاست این مشکل رو دارم , امکانش هست برای هاست به طور پیشفرض غیرفعال باشه ؟


مهران مرندی
تخصص : برنامه نویس
@mehranmarandi 3 سال پیش مطرح شد
0

میتونید خودتون فعالش کنید و تست کنید

PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true

Alireza
تخصص : توسعه دهنده وب
@alirezax5 3 سال پیش آپدیت شد
0

فعال کردم هم به خطای General error: 2000 Unknown MySQL error inبر میخورم هم به General error: 2000 Unknown MySQL error in
فک کنم همون closecursor راه حلشه.


برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام