PDA

View Full Version : مشکل در فچ کردن شرطی درخواست از دیتابیس با pdo و prepared statement



leaping
چهارشنبه 05 شهریور 1393, 17:44 عصر
سلام دوستان فرض کنید دستورات pdo من به این ترتیب هست



$Result = $G_Database->prepare('SELECT * FROM `example` ORDER BY id DESC LIMIT 0,3'); $Result->execute(); $Result->bindColumn('id', $Id); $Result->bindColumn('name', $Name); $Result->bindColumn('password', $Password); $G_Zero = 0; while($Result->fetch()) { if($Name == '0') { $number++; $IdW[$number] = $Id; $NameW[$number] = $Name; $PasswordW[$number] = $Password; } }

در این دستورات بالا اگر خانه name از جدول مساوی با چیزی غیر از صفر باشه وارد دستور حلقه نمیشه
خب تا اینجای کار درست
اما اگه من این کارو انجام بدم و یکی از رکوردها مساوی با صفر نباشه خب در این صورت تنها دوتا رکورد از جدول خونده میشه
اما من میخوام که اگر یکی صفر بود یک رکورد دیگه از جدول خونده باشه و همیشه مقادیری که از دیتابیس خونده میشن مساوی با 3 باشن تا جایی که مقادیر دیتابیس تموم بشن
متوجه منظورم شدین؟

MMSHFE
پنج شنبه 06 شهریور 1393, 11:56 صبح
چرا از خود دیتابیس نمیخواین کمکتون کنه؟

$Result = $G_Database->prepare('SELECT * FROM `example` WHERE (`name`<>\'0\') ORDER BY id DESC LIMIT 3');
$Result->execute();
$Result->bindColumn('id', $Id);
$Result->bindColumn('name', $Name);
$Result->bindColumn('password', $Password);
$G_Zero = 0;
while($Result->fetch()) {
$IdW[] = $Id;
$NameW[] = $Name;
$PasswordW[] = $Password;
}

leaping
پنج شنبه 06 شهریور 1393, 13:04 عصر
چرا از خود دیتابیس نمیخواین کمکتون کنه؟

$Result = $G_Database->prepare('SELECT * FROM `example` WHERE (`name`<>\'0\') ORDER BY id DESC LIMIT 3');
$Result->execute();
$Result->bindColumn('id', $Id);
$Result->bindColumn('name', $Name);
$Result->bindColumn('password', $Password);
$G_Zero = 0;
while($Result->fetch()) {
$IdW[] = $Id;
$NameW[] = $Name;
$PasswordW[] = $Password;
}
ممنون
برای اینکه با دستورات SQL زیاد آشنایی ندارم :D

leaping
پنج شنبه 06 شهریور 1393, 15:41 عصر
حالا مشکل شد یه چیز دیگه
میخوام یک سری از رکوردها بر اساس داده های یک جدول دیگه هم فیلتر بشن اما در این صورت هم میخوام باز همون تعداد رکورد برگردونده بشه
دستوری وجود نداره که اگه فلان رکورد خونده نشد به هر دلیلی یک رکورد دیگه خونده بشه؟

MMSHFE
شنبه 08 شهریور 1393, 22:26 عصر
بله میشه. چون ساختار جدولتون رو نمیدونم، با یک مثال توضیح میدم:
SELECT * FROM `posts` `p`
LEFT OUTER JOIN `users` `u`
ON `u`.`id`=`p`.`uid`
WHERE (`p`.`title` IS NOT NULL AND LOWER(`u`.`name`) LIKE 'ali%')
ORDER BY `p`.`id` DESC
LIMIT 3
الان این کوئری میاد پستهای کاربران رو همراه با اطلاعات کاربر مربوطه استخراج میکنه و فقط از بین پستهایی که فیلد title اونها خالی نیست و کاربری که پست گذاشته، اسمش با ali شروع میشده رو پیدا میکنه و سه تای آخر رو برمیگردونه.

leaping
یک شنبه 09 شهریور 1393, 08:36 صبح
ممنون آقای شهرکی بابت جواب
پس کلا با دستورات sql تا اینجا همه اینها حل میشه
منظورم اینه که پس تابع خاصی درون خود php وجود نداره درسته؟
تا اینجا همه اینها بر اساس دیتابیس بود خب اگر بخوایم بر اساس یه چیز دیگه فیلتر کنیم
مثلا ورودی کاربر و یا اینکه مثلا وجود داشتن و یا نداشتن یک متغییر خاص
خب در اینصورت دیگه راهی وجود نداره؟

MMSHFE
یک شنبه 09 شهریور 1393, 10:53 صبح
خوب کاری نداره که شما اون مقادیر ورودی رو از کاربر بگیرین و بعنوان پارامتر به کوئری بدین. دقت کنید که MySQL هم یک سرویسه که مدام روی سرور شما درحال اجراست و منطقیه که بخشی از بار کاری برنامه که مستقیماً با دیتابیس سروکار داره رو به MySQL بسپاریم تا توی مصرف حافظه و پردازنده صرفه جویی بشه. طبیعتاً سرعت کار وقتی که خود MySQL با جدولهای ایندکس و... که داره نتایج رو جستجو کنه، خیلی بیشتر از وقتی میشه که همه رکوردها رو بیاریم توی حافظه (با مصرف حافظه بیشتر) و بعد یکی یکی با PHP چک کنیم و اونایی که با شرایطمون میخونه رو جدا کنیم.

leaping
یک شنبه 09 شهریور 1393, 18:01 عصر
ممنون جناب شهرکی بابت پیگیریتون