PDA

View Full Version : سوال: بررسی یک آرایه در یک حلقه while (حل شد)



yeksib
پنج شنبه 07 دی 1391, 20:20 عصر
هنگام بیرون کشیدن یک جدول با استفاده از حلقه while میخواهم مقادیر موجود در جدول id شون با آرایه ی که از قبل در اختیار دارم مقایسه شده و یک دستور دیگه اجرا بشه البته مقادیر آرایه از یک جای دیگه بدست میاد.!



$result=mysql_query("SELECT * FROM tblr order by binary name ");
foreach($n as $i=>$b){ echo $i;
while($row=mysql_fetch_array($result)){
if($row['id']=$i) echo "yes";
else echo "no"; }

hidensoft
پنج شنبه 07 دی 1391, 20:39 عصر
تفاوت زیادی بین = و == هست. یه مقدار هم تفاوت بین == و ===. ولی نهایتا همشون متفاوت هستند.


if($row['id']==$i)

yeksib
پنج شنبه 07 دی 1391, 20:45 عصر
بله اشتباه تایپی بوده! حالا شما راهی به ذهن مبارکتون میرسه که راهنمایی کنید!

if($row['id']==$i)

MMSHFE
پنج شنبه 07 دی 1391, 23:09 عصر
با سلام، هرچند دقیقاً نفهمیدم مشکلتون چیه ولی اینو امتحان کنید:

$result = mysql_query('SELECT * FROM `tblr` ORDER BY `name`');
if($result && mysql_num_rows($result) > 0) {
while($row = mysql_fetch_array($result)) {
foreach($n as $i => $b) {
echo '<p>' . $i . ' : ' . ($row['id'] == $i ? 'Yes' : 'No') . '</p>' . PHP_EOL;
}
}
}

امیدوارم کارتون رو راه بندازه.

yeksib
جمعه 08 دی 1391, 00:42 صبح
خیلی ممنون دوست من . اما کدتون یک مشکلی که داره به اندازه تمامی رکورد ها، توی حلقه while یعنی خروجی yes و no چاپ میکنه!
فکر میکنم شما کاربر حرفه ای هستید ، بذارید شرح کارم رو بهتون توضیح بدم:
مدیر لیستی رو بصورت checkbox و textbox برای کاربران قرار داده یعنی تعدادی گزینه هستش که باید هم تیک بخورند و هم مقدار توشون وارد بشه(از دیتابیس خونده میشه) .این لیست باید بعدا توسط کاربر قابل ویرایش باشد.حالا من با استفاده از تابع serialize اندیس گزینه ها و مقادیر وارد شده رو توی دیتابیس وارد کردم حالا موقع بیرون کشیدنش که میخوام گزینه هایی که کاربر وارد کرده رو بصورت checked و در textbox ها مقادیری رو که وارد شده رو برای ویرایش نمایش بدم, که به مشکل برخوردم !
حالا به نظر شما اصلا کارم درسته!؟ یا اصلا روش دیگه ای هم وجود داره ؟ چون لیستی که مدیر قرار داده داره از دیتابیس خونده میشه و احتمال این رو داره که گزینه ها بیشتر بشن؟
از پاسختون ممنون میشم!

MMSHFE
جمعه 08 دی 1391, 09:55 صبح
با سلام، براتون یک کد نمونه ساختم. باید برای استفاده ازش، اول یک دیتابیس به اسم serialize بسازین و بعد توی phpMyAdmin فایل serialize.sql رو Import کنید. حالا با اجرای اسکریپت میتونید هم کاربر بسازین و هم لاگین کنید و اطلاعات ثبت شده توسط کاربران رو ببینید (هم چک باکس داره و هم کادر متن) که بصورت serialized توی دیتابیس ذخیره میشه و موقع استخراج هم unserialize میشه. دو تا کاربر نمونه هم گذاشتم:
1- نام کاربری ali رمز 1234
2- نام کاربری reza رمز 123456
هرکدوم فقط به اطلاعات ثبت شده توسط خودشون دسترسی دارن.
امیدوارم از روی خود اسکریپت متوجه روش کار بشین ولی اگه احیاناً سؤالی بود، در خدمتم.

yeksib
جمعه 08 دی 1391, 12:30 عصر
خیلی متشکرم ازتون ،ولی یک مشکلی هست من قصد دارم فیلدها رو از دیتابیس بخونم یعنی تعدادشون اصلا مشخص نیست ! یعنی شاید کاربر امروز سه تا از گزینه ها روپر کنه و فردا دوباره یه چندتا گزینه ی دیگه توسط مدیر اضافه بشه و دوباره کار بر مجبور باشه بقیه رو هم پر کنه!
خیلی از راهتماییتون ممنون میشم!

MMSHFE
جمعه 08 دی 1391, 12:48 عصر
دوست عزیز، این صرفاً یک نمونه بود که روش و منطق کار با serialization دستتون بیاد. برکسب نیازتون میتونید کد رو تغییر بدین. مثلاً توی همون کد فوق، کافیه هرجا حلقه 5 تایی گذاشته شده، بجای عدد 5 عدد بیشتری بگذارین. اگه دقت کنید کدی که گذاشتم هم نیازی نداره که همه کادرهای متن پر بشه یا همه گزینه ها انتخاب بشه.

yeksib
جمعه 08 دی 1391, 14:25 عصر
بله شما درست میفرمایید . اما کد من خیلی ساده تر از این هستش و من یک اشکال کوچیک توی کد خودم دارم که اگه منو راهنمایی کنید از تون ممنون میشم!


$n =array (
'1' => 'علی',
'2' => 'رضا',
'3' => 'حسین',
);

$result=mysql_query('SELECT * FROM `tbl` ORDER BY `name`');

while($row=mysql_fetch_array($result))
{
if(isset($n[ $row['id'] ]))
echo "yes".'نام کاربر';

else
echo "no";
}

یعنی وقت id با id کاربرانی که توی آرایه هستن برابر بود نام اون کاربر رو چاپ کنه!میتونید کد من رو تصحیح کنید ؟

MMSHFE
جمعه 08 دی 1391, 14:29 عصر
$n = array(
'1' => 'علی',
'2' => 'رضا',
'3' => 'حسین',
);

$result = mysql_query('SELECT * FROM `tbl` ORDER BY `name`');
if($result) {
while($row = mysql_fetch_array($result)) {
foreach($n as $id => $name) {
if($row['id'] == $id) {
echo '<p>Yes ' . $name . '</p>' . PHP_EOL;
}
}
}
}

موفق باشید.

yeksib
جمعه 08 دی 1391, 14:52 عصر
شما این کد رو نگاه کنید درصورت برقرار نبودن if وارد چرخه else میشود و به تعداد زیادی no چاپ میکند .من چطوری میتونم جلو این رو بگیرم؟


$n = array(
'1' => 'علی',
'2' => 'رضا',
'3' => 'حسین',
'4' => 'علی رضا',
'5' => 'احمد',
'6' => 'سعید',
);

$result=mysql_query("SELECT * FROM $this->tblrooms order by name ");
if($result) {
while($row = mysql_fetch_array($result)) {
foreach($n as $id => $name) {
if($row['id'] == $id) {
echo '<p>Yes ' . $name . '</p>' . PHP_EOL;
}else
echo '<p>no</p>' . PHP_EOL;
}
}
}

MMSHFE
جمعه 08 دی 1391, 14:56 عصر
$n = array(
'1' => 'علی',
'2' => 'رضا',
'3' => 'حسین',
'4' => 'علی رضا',
'5' => 'احمد',
'6' => 'سعید',
);

$result = mysql_query("SELECT * FROM {$this->tblrooms} ORDER BY `name`");
if($result) {
while($row = mysql_fetch_array($result)) {
if(in_array($row['id]', array_keys($n))) {
echo '<p>Yes ' . $n[$row['id']] . '</p>' . PHP_EOL;
}
else {
echo '<p>No</p>' . PHP_EOL;
}
}
}

yeksib
جمعه 08 دی 1391, 15:16 عصر
$n = array(
'1' => 'علی',
'2' => 'رضا',
'3' => 'حسین',
'4' => 'علی رضا',
'5' => 'احمد',
'6' => 'سعید',
);

$result = mysql_query("SELECT * FROM {$this->tblrooms} ORDER BY `name`");
if($result) {
while($row = mysql_fetch_array($result)) {
if(in_array($row['id]', array_keys($n))) {
echo '<p>Yes ' . $n[$row['id']] . '</p>' . PHP_EOL;
}
else {
echo '<p>No</p>' . PHP_EOL;
}
}
}


خیلی خیلی ازتون ممنونم .
عالی بود!
یاعلی.

yeksib
جمعه 08 دی 1391, 19:53 عصر
سلام و دورود !
معذرت میخواهم تابع serializeبصورت کد ذخیره میکنه ،اما برای سرچ کردن یک مقدار داخل رکورد هامون باید چیکار کنیم؟
درضمن من وقتی ذخیره میکنم به این صورت ذخیره میکنه! a:3:{i:4;s:1:"2";i:2;s:1:"9";i:3;s:1:"8";}

یه سوال دیگه شما چرا برای ذخیره کردن مقادیر از این روش استفاده میکنید؟


Query("INSERT INTO `info` (`uid`,`choices`) VALUES ('{$uid}','{$choices}')")

یعنی چرا مقادیر رو توی کروشه میگذارید؟
و اون روش ADDR که برای آدرسهاتون استفاده میکنید برای چیه؟
ببخشید ها خیلی سوال پرسیدم!:لبخند:

MMSHFE
جمعه 08 دی 1391, 21:58 عصر
برای جستجو به روش معمولی باید کار کنید چون serialize فقط یکسری اطلاعات جانبی اضافه میکنه و داده های اصلی رو بهم نمیریزه. مثلاً a:3 یعنی آرایه با 3 عنصر یا s:6 یعنی رشته بطور 6 کارکتر و i:4 یعنی عدد صحیح با مقدار 4 و...
وجود آکولادها در اطراف اسم متغیرها باعث میشه محدوده متغیر مشخص بشه و حتی بشه از مقادیر آرایه ها توی رشته به راحتی استفاده کنیم. مثلاً اگه بخوایم بعد از اسم متغیر name$ حرف a هم چاپ بشه، مینویسیم {$name}a و اگه آکولادها رو نگذاریم میشه namea$ و پیغام خطا میگیریم که میگه متغیر namea$ تعریف نشده. در کل برای استاندارد نویسی هست.
ADDR هم یک ثابت هست که استفاده کردم (برای آدرس سایت) اینطوری اگه آدرس عوض شد، نیازی نیست همه لینکهای سایت رو اصلاح کنم و فقط ثابتی که توی فایل config.php تعریف شده رو اصلاح میکنیم و همه لینکها بطور خودکار تغییر میکنن.
موفق باشید.