💻 آخرین فرصت یادگیری برنامه‌نویسی با آفر ویژه قبل از افزایش قیمت در ۵ آذر ماه (🎁 به همراه یک هدیه ارزشمند )
۰ ثانیه
۰ دقیقه
۰ ساعت
۳ میلاد بهرامی
سوال در مورد prepared statemnet‌ها و bind_result
جامعه پی اچ پی ایجاد شده در ۲۸ فروردین ۱۳۹۹

سلام خسته نباشید استاد عزیز

اگه بخوایم همچین کوئری بزنیم چطور باید هندل بشه؟

"SELECT * FROM users WHERE id = ?"

 

سلام

دقیقا متوجه نشدم منظورت از هندل کردن چی هست؟

خوب این هم یه رکورد بر می‌گردونه که مثل بقیه حالات می‌تونید مثلا با متد fetch_all رکوردهاشو بگیرید.

لقمان آوند ۲۸ فروردین ۱۳۹۹، ۲۱:۱۱

ببخشید نمیدونم چطور منظورم رو دقیق برسونم

من یه عادتی دارم که همیشه سورس اصلی رو میخونم و دقیقا تک تک توابع و ارتباطشون و نوع برگشتیشون و ... رو سعی میکنم ریز به ریز متوجه بشم

$conn = new mysqli('localhost','root','','testdb');
$sql = "SELECT * FROM users WHERE  id = 6";
$row = $conn->query($sql);
$res = $row->fetch_assoc();
var_dump($res);

وقتی از تابع query() استفاده میشه کاملا واسم واضح هست که اگه کوئری خطای سینتکس یا ایرادی داشته باشه مقدار false برمیگرده

اگه کوئری update یا delate یا ... باشه مقدار true برمیگرده

و اگه کوئری select یا show یا describe و ... باشه یه mysqli_result object برمیگرده که حالا اینو با توابعی مثل fetch_assoc و یا ... خیلی راحت دریافت میکنم

منظورم این هست که توی این حالت ارتباط بین کلاسا رو خیلی خوب درک میکنم

 

ولی وقتی از تابع prepare استفاده میشه این رابطه رو نمیتونم خوب درک کنم

 

 

میشه لطفا تک کدی که کوئری زیر رو هندل میکنه رو برام توضیح بدین ارتباط بین کلاس‌ها و توابعش رو

"SELECT * FROM users WHERE  id = ?";

وقتی از prepare استفاده میکنیم چیزی که برمیگرده یه mysqli_stmt object هست

خب حالا وقتی از تابع fetch استفاده میکنم چیزی که برمیگرده فقط یه مقدار true یا false هست نه دیتایی که میخوام

$conn = new mysqli('localhost','root','','testdb');
$sql = "SELECT * FROM users WHERE id = 6";
$stmt = $conn->prepare($sql);
$stmt->execute();
$res = $stmt->fetch();
var_dump($res);

امیدوارم تونسته باشم منظورم رو برسونم

میلاد بهرامی ۲۸ فروردین ۱۳۹۹، ۲۱:۴۰

سلام.

اگر بصورت کلی بخوام بگم، همونطور که احتمالا میدونید prepare برای جلوگیری از حملات Sql Injection معرفی شده.

قسمت اول:

$stmt = $conn->prepare("SELECT `name`, `age` FROM `users` WHERE `id` = ?");

در اینجا کوئری(مثل یک تمپلیت فرض کنید) بدون هیج مقداری برای دیتابیس ارسال میشه. (? بعنوان placeholder برای مقادیر هست.)

قسمت دوم:

$id = 6;
$stmt->bind_param('i', $id);

اینجا برای دیتابیس ارسال میکنیم که placeholder اول مقدارش ۶ هست.(هنوز کوئری اجرا نمیشه)

* البته بجای استفاده از bind_param میشه توو خود کوئری، بصورت مستقیم مقدار دهی کرد ولی راه safe استفاده از این متد هست وگرنه دلیلی واسه استفاده از prepare وجود نداره و از متد query استفاده میشه.

قسمت سوم:

$stmt->execute();

در این قسمت دستور میدیم که کوئری با variable هایی که bind کردیم execute بشه.

قسمت چهارم:

$stmt->bind_result($name, $age)

بعد از execute کوئری، در این متد مشخص میکنیم نتایجی که fetch خواهیم کرد در چه متغیرهایی bind شوند.

قسمت پنجم:

$stmt->fetch();

نتایج متد fetch در داخل متغیرهای مشخص شده در متد bind_result قرار میگیرن.

متد fetch اگر true برگردونه یعنی یک داده fetch شده است. اگر false برگردونه یعنی خطایی اتفاق افتاده و اگر null برگردونه یعنی دیتایی وجود نداشته یا دیگه پیدا نشده.

 

و در آخر:

echo $name . ':' . $age;

 

محسن موحد ۳۰ فروردین ۱۳۹۹، ۰۲:۴۱