PDA

View Full Version : سوال: مشکل در کلاس دیتابیس من (mysql_fetch_array() expects parameter 1)



amin7x
شنبه 05 مرداد 1392, 06:10 صبح
سلام به همه دوستان عزیز سایت برنامه نویس
من یک مشکل دارم توی کلاس دیتابیسم و وقتی این که میخوام از کلاس برای Fetch کردن استفاده کنم با ارور زیر مواجه میشم:



Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in class.database.php on line 22


کلاس دیتابیس من:


<?php
class DataBase{
private $connectionVar;

public function __construct (){
if(!$this->connectionVar = mysql_connect('localhost', 'root', '')){
die('Could not connect: ' . mysql_error());
}

if(!mysql_select_db('test', $this->connectionVar)){
die('Could not select: ' . mysql_error());
}

return mysql_query("SET NAMES 'utf-8'", $this->connectionVar);
}

public function Query ($Sta){
return mysql_query($Sta, $this->connectionVar) or die('Could not query: ' . mysql_error());
}

public function Fetch ($QueryVar){
mysql_fetch_array($QueryVar);
}
}

$db = new Database();
$Query = $db->Query("SELECT * FROM `user`");
echo $db->Fetch($Query);
?>

MMSHFE
شنبه 05 مرداد 1392, 07:58 صبح
کوئری شما خطا داشته. mysql_error رو چاپ کنید ببینید مشکل از چیه. 'SET NAMES 'utf8 درسته و utf-8 اشتباهه. درمورد کوئری دوم هم چک کنید ببینید اسم جدول رو درست نوشتین یا نه. یا به درستی تونستین به دیتابیس وصل بشین؟ همه اینها رو mysql_error مشخص میکنه.

SlowCode
شنبه 05 مرداد 1392, 13:12 عصر
سلام
تو خط 27 اسم جدول رو داخل کوتیشن نوشتین. من هر وقت اینطوری مینویسم خطا میده.
آقای شهرکی به نظرتون علتش چیه؟ من بار ها دیدم که شما و البته سایت های دیگه اسم جدول و فیلدها رو داخل کوتیشن نوشتین. دلیلش هم فکر کنم به خاطر امنیت باشه، ولی واسه من جواب نمیده!

wallfa
شنبه 05 مرداد 1392, 13:21 عصر
شاید مای اسکیوالتون نسخه قدیمیه ! وگر نه نوع نوشتا مشکلی نداره !

MMSHFE
شنبه 05 مرداد 1392, 15:25 عصر
سلام
تو خط 27 اسم جدول رو داخل کوتیشن نوشتین. من هر وقت اینطوری مینویسم خطا میده.
آقای شهرکی به نظرتون علتش چیه؟ من بار ها دیدم که شما و البته سایت های دیگه اسم جدول و فیلدها رو داخل کوتیشن نوشتین. دلیلش هم فکر کنم به خاطر امنیت باشه، ولی واسه من جواب نمیده!
چون شما توی کوتیشن تک مینویسین (Single Quote : ') درحالی که من توی کوتیشن برعکس (Back Quote: `) مینویسم (کلید بالای Tab). توی زبان SQL اسامی فیلدهای و جداول و شناسه هایی که خودتون با AS تعریف میکنید توی کوتیشن برعکس و مقادیر توی کوتیشن تک نوشته میشن.

amin7x
شنبه 05 مرداد 1392, 15:47 عصر
کوئری شما خطا داشته. mysql_error رو چاپ کنید ببینید مشکل از چیه. 'SET NAMES 'utf8 درسته و utf-8 اشتباهه. درمورد کوئری دوم هم چک کنید ببینید اسم جدول رو درست نوشتین یا نه. یا به درستی تونستین به دیتابیس وصل بشین؟ همه اینها رو mysql_error مشخص میکنه.

ممنون از پاسختون
من تغییراتی که گفته بودید رو انجام دادم ولی بازهم همون مشکل رو دارم.
mysql_error هم چاپ کردم ولی چیزی نشون نمیده!


سلام
تو خط 27 اسم جدول رو داخل کوتیشن نوشتین. من هر وقت اینطوری مینویسم خطا میده.
آقای شهرکی به نظرتون علتش چیه؟ من بار ها دیدم که شما و البته سایت های دیگه اسم جدول و فیلدها رو داخل کوتیشن نوشتین. دلیلش هم فکر کنم به خاطر امنیت باشه، ولی واسه من جواب نمیده!

بک کوتیشن ها هم برداشتم ولی بازهم جواب نداد!


شاید مای اسکیوالتون نسخه قدیمیه ! وگر نه نوع نوشتا مشکلی نداره !

ورژن mysql من 5.5.24

amin7x
شنبه 05 مرداد 1392, 15:49 عصر
چون شما توی کوتیشن تک مینویسین (Single Quote : ') درحالی که من توی کوتیشن برعکس (Back Quote: `) مینویسم (کلید بالای Tab). توی زبان SQL اسامی فیلدهای و جداول و شناسه هایی که خودتون با AS تعریف میکنید توی کوتیشن برعکس و مقادیر توی کوتیشن تک نوشته میشن.

الان بک کوتیشن رو با سینگل کوتیشن عوض کردم. ارور زیر رو گرفتم:



Could not query: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''food'' at line 1

sh.n.n786
شنبه 05 مرداد 1392, 15:56 عصر
درود و ...


<?php
class DataBase{
private $connectionVar;
public function __construct (){
if(!$this->connectionVar = mysql_connect('localhost', 'root', '')){
die('Could not connect: ' . mysql_error());
}
if(!mysql_select_db('test', $this->connectionVar)){
die('Could not select: ' . mysql_error());
}
return mysql_query("SET NAMES 'utf-8'", $this->connectionVar);
}
public function Query ($Sta){
return mysql_query($Sta, $this->connectionVar);
}
public function Fetch ($QueryVar){
return mysql_fetch_assoc($this->Query($QueryVar));
}
}
$db = new Database();
print_r($db->Fetch("SELECT * FROM `table` WHERE 1"));
?>

موفق باشی

amin7x
شنبه 05 مرداد 1392, 16:06 عصر
درود و ...


<?php
class DataBase{
private $connectionVar;
public function __construct (){
if(!$this->connectionVar = mysql_connect('localhost', 'root', '')){
die('Could not connect: ' . mysql_error());
}
if(!mysql_select_db('test', $this->connectionVar)){
die('Could not select: ' . mysql_error());
}
return mysql_query("SET NAMES 'utf-8'", $this->connectionVar);
}
public function Query ($Sta){
return mysql_query($Sta, $this->connectionVar);
}
public function Fetch ($QueryVar){
return mysql_fetch_assoc($this->Query($QueryVar));
}
}
$db = new Database();
print_r($db->Fetch("SELECT * FROM `table` WHERE 1"));
?>

موفق باشی

همش به خواطر این بود!!


or die('Could not query: ' . mysql_error())


میشه بپرسم چرا این طوری شده بود؟
ظاهرا بایدجواب بده برای چک کردن خطای Query.

MMSHFE
شنبه 05 مرداد 1392, 16:11 عصر
دوست گرامی، or die یک ساختار مناسب برای نمایش خطا هست، منتها فقط برای زمان اتصال به موتور بانک اطلاعاتی و انتخاب دیتابیس. برای کوئریها بهتره با if معمولی چک کنید و اگه false بود، mysql_error رو چاپ کنید چون دستور exit یا همون die دیگه نمیگذاره بقیه اسکریپت اجرا بشه. ضمناً or die رو که توی دستور return نمینویسن.

amin7x
دوشنبه 07 مرداد 1392, 02:48 صبح
ممنون از همه دوستان
یک مشکلی پیش امده.
من وقتی Fetch میکنم مشکلی نیست ولی وقتی توی حلقه میندازم ، میوفته توی یک حلقه نامحدود.



<?php
class DataBase{
private $connectionVar;

public function __construct (){
if(!$this->connectionVar = mysql_connect('localhost', 'root', '')){
die('Could not connect: ' . mysql_error());
}

if(!mysql_select_db('dayere', $this->connectionVar)){
die('Could not select: ' . mysql_error());
}

return mysql_query("SET NAMES 'utf8'", $this->connectionVar);
}

public function Query ($Sta){
return mysql_query($Sta, $this->connectionVar);
}

public function Fetch ($QueryVar){
return mysql_fetch_assoc($this->Query($QueryVar));
}

public function __destruct(){
mysql_close($this->connectionVar);
}
}

$db = new Database();
while($fetch = $db->Fetch("SELECT * FROM `food`")){
echo $fetch['id'];
}
?>


و یک مشکل دیگه ام دارم توی Fetch معمولی (بدون حلقه) من print_r میتونم مقادیر رو چاپ کنم ولی وقتی از echo استفاده میکنم ارور زیر رو میگیرم:


Notice: Array to string conversion


کد زمان استفاده از print_r :


$db = new Database();
print_r ($db->Fetch("SELECT * FROM `food`"));


کد زمان استفاده از echo :


$db = new Database();
echo $db->Fetch("SELECT * FROM `food`");

MMSHFE
دوشنبه 07 مرداد 1392, 09:48 صبح
1- تابع fetch شما هربار که صدا زده میشه، دوباره کوئری رو اجرا میکنه و درنتیجه همیشه اشاره گر در اولین رکورد باقی میمونه. باید ابتدا با صدا زدن Query کوئری رو اجرا کنید و توی متغیر ذخیره کنید و بعد، توی حلقه while تابع Fetch رو صدا بزنید و اون متغیر رو بهش بدین. خود تابع Fetch رو هم تغییر بدین تا از این متغیر بعنوان پارامتر استفاده کنه نه از نتیجه اجرای تابع Query
2- خروجی mysql_fetch_assoc یک آرایه است. واقعاً که انتظار ندارین بتونید با echo چاپش کنید؟ برای چاپ با echo باید از حلقه for یا foreach استفاده کنید.