سوال در مورد prepared statemnet ها و bind_result

پرسیده شده
فعالیت 1478 روز پیش
دیده شده 1340 بار
0

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

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

"SELECT * FROM users WHERE id = ?"

 

فایل پیوست

میلاد بهرامی
میلاد بهرامی

28 فروردین 99

0
حذف شده

سلام

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

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

فایل پیوست

لقمان آوند

توسط

لقمان آوند

28 فروردین 99

0
حذف شده

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

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

$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);

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

فایل پیوست

میلاد بهرامی

توسط

میلاد بهرامی

28 فروردین 99

7

مورد تایید استاد

حذف شده

سلام.

اگر بصورت کلی بخوام بگم، همونطور که احتمالا میدونید 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;

 

فایل پیوست

محسن موحد

توسط

محسن موحد

30 فروردین 99