سلام خدمت استاد و دوستان عزیز
استاد من تویه درک نحوه عملکرد متدهای prepare و bind_param کمی مشکل دارم. اینطور که شما تو کلیپ توضیح دادی برداشت من این بوده که با استفاده از این دوتا متد میشه قبل از اجرای query مقادیری که کاربر وارد کرده رو validation کرد تا امن بشن. مفهوم کلیشو فهمیدم ولی هنو کلمه اماده سازی واسم مبهمه
۱. طبق نوشته پایین (از سایت w۳schools) متد prepare ابتدا دستور sql رو به طرف پایگاه داده میفرسته (البته به جای پارامترها از علامت ؟ استفاده شده)
۲. پایگاه داده اونو پردازش و کامپال و بهینه سازی میکنه و نتیجه رو بدون اجرای دستور ذخیره میکنه.
۳. اخرشم متد bind_param مقادیر رو میچسبونه به پارامترها و پایگاه داده دستور رو اجرا میکنه. (و چون مقادیر پارامترها بعدا و توسط یک پروتکل متفاوت به سرور ارسال شده از حملات SQL جلوگیری میکنند)
از طرفی شما گفتین مقادیر رو میزاریم تویه متد bind_param تا مشکلات امنیتیشو رفع کنه و در نهایت بزاره تویه علامت سوالا و کوئری اجرا بشه.
الان سوال من اینکه : بلاخره این وسط چه اتفاقی میوفته ؟
چیزی که خودم در کل فهمیدم (درست یا غلطتشو نمیدونم) اینه که متد prepare دستور query رو میفرسته سمت database و یک ابجکتی در اختیار ما میزاره تا بتونیم با اون کوئری که سمت database هست کار کنیم. بعدشم میشه با استفاده از متد bind_param مقادیرو جا علامت سوالا بزاریم و چون مقادیر پارامترها بعدا و توسط یک پروتکل متفاوت به سرور ارسال شده از حملات SQL جلوگیری میشود ( و بر خلاف گفته شما خود متد bind_param تو امن سازی مقادیر نقش مستقیم نداره و صرفا مقادیرو bind میکنه)
Prepared statements basically work like this:
۱. Prepare: An SQL statement template is created and sent to the database. Certain values are left unspecified, called parameters (labeled "?"). Example: INSERT INTO MyGuests VALUES(?, ?, ?)
۲.The database parses, compiles, and performs query optimization on the SQL statement template, and stores the result without executing it
۳.Execute: At a later time, the application binds the values to the parameters, and the database executes the statement. The application may execute the statement as many times as it wants with different values
Prepared statements are very useful against SQL injections, because parameter values, which are transmitted later using a different protocol, need not be correctly escaped. If the original statement template is not derived from external input, SQL injection cannot occur.