PDA

View Full Version : آموزش: نمایش نتایج یک select



chiya404
جمعه 27 دی 1392, 22:23 عصر
سلام
من با کد زیر یک سلکت انجام می دم و مقدار result رو بر می گردونم . فقط نمی دونم چطور مقدار رو با حلقه ی while نمایش بدم . هر بار توی حلقه گیری می کنم و سیستمم کراش می کنه

function do_select($sql)
{
$stm=$this->connection->query($sql) ;
$row=$stm->fetch();
$this->result=$row;
}
و اینکه از pdo واسه دیتابیس استفاده میکنم .

MMSHFE
جمعه 27 دی 1392, 23:15 عصر
دوست عزیز، query رو خارج از حلقه اجرا کنید. این کد هربار اجرا میشه، دوباره کوئری رو اجرا میکنه و درنتیجه دائماً اولین رکورد fetch میشه و هیچوقت به انتهای رکوردهای fetchشده نمیرسه.

chiya404
شنبه 28 دی 1392, 11:59 صبح
من فقط می خوام مقدار برگشتی result رو توی حلقه بذارم و مقادیر رو نشون بدم نه کل تابع رو ...

MMSHFE
شنبه 28 دی 1392, 12:22 عصر
خوب پس باید توی تابع، stm$ رو return کنید نه row$ رو چون row$ فقط یک سطره مگه اینکه همه سطرها رو fetch کنید و توی یک آرایه بریزین و اون آرایه رو return کنید.

SA_Developer
شنبه 28 دی 1392, 12:46 عصر
اگر میخوای از while استفاده کنی که تمام رکوردها رو fetch کنی ازfetchAll استفاده کن
مثال:


<?php

class query
{

protected $connection = null;

function __construct ($DNS, $DB_USER, $DB_PWD = '')
{
$this->connection = new PDO($DNS, $DB_USER, $DB_PWD);
}

function __destruct ()
{
$this->connection = null;
}

function do_select ($sql)
{
$stm = $this->connection->query($sql);
return $stm->fetchAll();
}
}
$DNS = 'mysql:host=localhost;dbname=cms;charset=utf8';

$obj = new query($DNS, 'root');

$rows = $obj->do_select('SELECT * FROM posts');

foreach ($rows as $row) {
echo $row['ID'], '<br>';
echo $row['title'], '<br/>';
echo $row['date'], '<br/>';
}

chiya404
شنبه 28 دی 1392, 13:03 عصر
حالا من اگه $stm رو برگشت بدم ... بعد کد while چجوری میشه ...با این حساب باید مقدار $stm رو fetch کنم .... درست فهمیدم ؟

MMSHFE
شنبه 28 دی 1392, 13:14 عصر
بله داخل while باید هربار یک سطر رو fetch مگه اینکه به روشی که دوستمون گفتن، با fetchAll همه رو بصورت یک آرایه معمولی PHP برگردونید و اونوقت با foreach و ترکیب each و while و سایر حلقه ها کار موردنظرتون رو انجام بدین.

chiya404
شنبه 28 دی 1392, 13:30 عصر
این fetchall یه مشکلی که داره اینه که مثلا اگه توی دستور اس کیو ال لیمت رو تعریف کنی روی 10 تا اگه صدتا رکورد داشته باشی بقیه رو به صورت array نشون میده . این fetch هم گویا فقط یک سطر رو بر می گردونه
یعنی ما دستوری ما بین همه و یک نداریم !!!!

MMSHFE
شنبه 28 دی 1392, 13:56 عصر
function do_select ($sql)
{
$rows = array();
$stm = $this->connection->query($sql);
while($row = $stm->fetch()) {
$rows[] = $row;
}
return $rows;
}

SA_Developer
شنبه 28 دی 1392, 14:12 عصر
این fetchall یه مشکلی که داره اینه که مثلا اگه توی دستور اس کیو ال لیمت رو تعریف کنی روی 10 تا اگه صدتا رکورد داشته باشی بقیه رو به صورت array نشون میده . این fetch هم گویا فقط یک سطر رو بر می گردونه
یعنی ما دستوری ما بین همه و یک نداریم !!!!
خیر چنین چیزی نیست
احتمالا کدتون اشتباه بوده میتونید یه مثال بزنید؟
در این مواقع بهترین کار اینه که از fetchAll و foreach استفاده کنید.
اینو حتما ببین: http://wiki.hashphp.org/PDO_Tutorial_for_MySQL_Developers#Running_Simple_S elect_Statements

chiya404
شنبه 28 دی 1392, 14:21 عصر
الان یکی از سطرها رو ده بار نشون میده به جای اینکه هر ده تا سطر رو نشون بده

chiya404
شنبه 28 دی 1392, 14:23 عصر
الان کد من اینجوری شده :

function do_select($sql)
{

$rows = array();
$stm = $this->connection->query($sql);
return $this->result=$stm;
}
موقع نمایش :

$pop=new db;
$pop->do_select("select * from test order by id desc limit 5");
$row=$pop->result;

while($rows = $row->fetch())
{
echo $rows['name']."<br />";
}