جلسه هجدهم PHP: آموزش کامل زبان برنامه نویسی پی اچ پی مقدماتی تا پیشرفته
در این مقاله از کدپز با جلسه هجدهم PHP که با دو موضوع دریافت آخرین شناسه در پایگاه داده MySQL
و آَشنایی با کاربرد دستورات آماده PHP در MySQL می باشد، در خدمت شما هستیم.
در قسمت قبل در جلسه هفدهم PHP نحوه وارد کردن اطلاعات به صورت تکی و چند تایی در پایگاه داده MySQL را به طور کامل با ذکر مثال بیان کردیم.
در پایان این جلسه:
دستورات آماده PHP در MySQL را بررسی خواهیم کرد.
و همچنین نحوه ی دریافت آخرین شناسه در پایگاه داده MySQL با زبان PHP را در جلسه هجدهم PHP آموزش خواهید دید. با ما همراه باشید.
دریافت آخرین شناسه در پایگاه داده MySQL
اگر ویژگی AUTO_INCREMENT را در یک فیلد فعال باشد و ما دستور INSERT و یا UPDATE را اجرا کنیم، می توانیم بلافاصله ID آخرین شناسه وارد شده را دریافت کنیم. در مثال زیر ستون “id” در جدول “MyGuests” ویژگی AUTO_INCREMENT را دارا است.
1 2 3 4 5 6 7 8 |
CREATE TABLE MyGuests ( id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, firstname VARCHAR(30) NOT NULL, lastname VARCHAR(30) NOT NULL, email VARCHAR(50), reg_date TIMESTAMP ) |
مثال های زیر همانند مثال های جلسه هفدهم PHP می باشد. که در جلسه قبل ذکر شد. تنها یک خط جدید برای یافتن ID آخرین شناسه وارد شده اضافی شده است. همچنین آخرین ID وارد شده را چاپ کردیم.
به 3 مثال زیر از جلسه هجدهم PHP توجه کنید.
مثال اول: به صورت MySQL (شی گرایی):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
<?php $servername = "localhost"; $username = "username"; $password = "password"; $dbname = "myDB"; // Create connection $conn = new mysqli($servername, $username, $password, $dbname); // Check connection if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } $sql = "INSERT INTO MyGuests (firstname, lastname, email) VALUES ('John', 'Doe', 'john@example.com')"; if ($conn->query($sql) === TRUE) { $last_id = $conn->insert_id; echo "New record created successfully. Last inserted ID is: " . $last_id; } else { echo "Error: " . $sql . "<br>" . $conn->error; } $conn->close(); ?> |
مثال دوم از : به صورت MySQL (رویه ایی):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
<?php $servername = "localhost"; $username = "username"; $password = "password"; $dbname = "myDB"; // Create connection $conn = mysqli_connect($servername, $username, $password, $dbname); // Check connection if (!$conn) { die("Connection failed: " . mysqli_connect_error()); } $sql = "INSERT INTO MyGuests (firstname, lastname, email) VALUES ('John', 'Doe', 'john@example.com')"; if (mysqli_query($conn, $sql)) { $last_id = mysqli_insert_id($conn); echo "New record created successfully. Last inserted ID is: " . $last_id; } else { echo "Error: " . $sql . "<br>" . mysqli_error($conn); } mysqli_close($conn); ?> |
مثال سوم از جلسه هجدهم PHP : به صورت PDO
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<?php $servername = "localhost"; $username = "username"; $password = "password"; $dbname = "myDBPDO"; try { $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password); // set the PDO error mode to exception $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $sql = "INSERT INTO MyGuests (firstname, lastname, email) VALUES ('John', 'Doe', 'john@example.com')"; // use exec() because no results are returned $conn->exec($sql); $last_id = $conn->lastInsertId(); echo "New record created successfully. Last inserted ID is: " . $last_id; } catch(PDOException $e) { echo $sql . "<br>" . $e->getMessage(); } $conn = null; ?> |
دستورات آماده PHP در MySQL
دستورات آماده ای که بیان می کنیم بسیار پر کاربرد برای مقابله با SQL injection هستند.
معرفی دستورات آماده PHP و پارامتر های مرتبط با آن
یک دستور آماده یک ویژگی ست که در مقابل استفاده چندین بار دستورات شبیه به هم SQL با راندمان بالا استفاده می شود.
دستورات آماده شده SQL عمدتاً به این صورت انجام می شوند:
به 3 مورد زیر از جلسه هجدهم PHP توجه نمایید.
_ آماده سازی: یک دستور SQL ایجاد شده و به پایگاه داده ارسال می شود. برخی مقادیر پارامتر هایی نامیده می شوند که به صورت نامشخص باقی می مانند. برای مثال:
1 |
INSERT INTO MyGuests VALUES(?, ?, ?) |
- _ پایگاه داده دستور SQL را می خواند. و نتیجه را بدون اجرا آن ذخیره می کند. البته با استفاده از بهینه سازی query یا query optimization سریع ترین راه را برای اجرای آن مشخص می کند. اما به هر حال در آخر نتایج حاصل از query را بدون اجرای نهایی در حافظه نگهداری می کند.
- _ اجرا: در مرحله آخر، برنامه مقادیر را به پارامترها ارسال می کند حال پایگاه داده دستور SQL را اجرا می کند. برنامه می تواند یک دستور SQL را با value های متفاوت، به هرتعداد که بخواهد اجرا کند.
شما در حال آموزش و یادگیری جلسه هجدهم PHP می باشید.
در مقایسه با اجرای دستورات SQL به صورت مستقیم، دستورات آماده 3 ویژگی به خصوص دارند که در ادامه جلسه هجدهم PHP به آن می پردازیم:
_ دستورات آماده، زمان پردازش کد ها را کاهش می دهند. زیرا آماده سازی query تنها یک بار انجام می شود. (هرچند دستور چند بار اجرا می شود).
_ پارامتر های متصل حجم ارسالی به سرور را بسیار کاهش می دهند. زیر در هر بار اجرا کد تنها نیاز به ارسال پارامتر ها است و نه تمام query.
_ همانطور که پیش تر گفته شد دستورات آماده بسیار پر کاربرد برای مقابله با SQL injection هستند. زیرا مقادیر پارامتر ها که با استفاده از یک پروتکل مختلف منتقل می شوند، از حملات SQL جلوگیری می کنند.
دستورات آماده SQL در mysqli
در مثال زیر از جلسه هجدهم PHP ، از دستورات آماده و پارامتر های متصل در mysqli استفاده می شود.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
<?php $servername = "localhost"; $username = "username"; $password = "password"; $dbname = "myDB"; // Create connection $conn = new mysqli($servername, $username, $password, $dbname); // Check connection if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } // prepare and bind $stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email) VALUES (?, ?, ?)"); $stmt->bind_param("sss", $firstname, $lastname, $email); // set parameters and execute $firstname = "John"; $lastname = "Doe"; $email = "john@example.com"; $stmt->execute(); $firstname = "Mary"; $lastname = "Moe"; $email = "mary@example.com"; $stmt->execute(); $firstname = "Julie"; $lastname = "Dooley"; $email = "julie@example.com"; $stmt->execute(); echo "New records created successfully"; $stmt->close(); $conn->close(); ?> |
توضیح قسمتی از کد بالا از جلسه هجدهم PHP :
1 |
"INSERT INTO MyGuests (firstname, lastname, email) VALUES (?, ?, ?)" |
در دستور SQL ما یک علامت سوال را در جایی که می خواهیم یک string و double را جایگزین کنیم، قرار داده ایم. حال به کد تابع ()bind_parap نگاه کنید.
1 |
$stmt->bind_param("sss", $firstname, $lastname, $email); |
این تابع پارامتر ها را به کوئری SQL ارسال می کند. و البته نوع پارامتر ها را به دیتابیس می گوید. پارامتر “sss” نوع داده ها را لیست می کند. کاراکتر “s” نیز به دیتابیس متذکر می شود که با string سروکار دارد.
کاراکتر این پارامتر می تواند یکی از 4 نوع زیر باشد:
به انواع آن از جلسه هجدهم PHP توجه نمایید.
_ i = integer
_ d = double
_ s = string
_ b = BLOB
هر پارامتر یکی از این 4 نوع می باشد.
همچنین زمانی که نوع داده را حتما تعیین می کنیم، ریسک حملات SQL injection کاهش می یابد.
دستورات آماده SQL در PDO
در مثال زیر از جلسه هجدهم PHP ، از دستورات آماده و پارامتر های متصل در PDO استفاده می شود.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
<?php $servername = "localhost"; $username = "username"; $password = "password"; $dbname = "myDBPDO"; try { $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password); // set the PDO error mode to exception $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // prepare sql and bind parameters $stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email) VALUES (:firstname, :lastname, :email)"); $stmt->bindParam(':firstname', $firstname); $stmt->bindParam(':lastname', $lastname); $stmt->bindParam(':email', $email); // insert a row $firstname = "John"; $lastname = "Doe"; $email = "john@example.com"; $stmt->execute(); // insert another row $firstname = "Mary"; $lastname = "Moe"; $email = "mary@example.com"; $stmt->execute(); // insert another row $firstname = "Julie"; $lastname = "Dooley"; $email = "julie@example.com"; $stmt->execute(); echo "New records created successfully"; } catch(PDOException $e) { echo "Error: " . $e->getMessage(); } $conn = null; ?> |
تبریک میگم شما موفق شدید تا جلسه هجدهم PHP از کدپز را پشت سر بگذارید.
📝<<به خودت برای این همه راهی که اومدی افتخار کن و به خودت برای مسیری که باید بری ایمان داشته باش. . . . >> ☑️
6 Comments
Join the discussion and tell us your opinion.
سلام
به نظرم قبل از این جمله sql injection رو توضیح بدین چون من رفتم سایت های دیگه خوندمش:
«دستورات آماده PHP در MySQL
دستورات آماده ای که بیان می کنیم بسیار پر کاربرد برای مقابله با SQL injection هستند.»
با سلام
ممنون از پیشنهاد به جا ودرست شما.
به زودی مقالهای با موضوع SQL injection در PHP منتشر خواهیم کرد و در همین جا لینک آن را قرار خواهیم داد. اما اگر توضیحی کوتاه در این باره بخواهید باید بگویم که:
اگر شما ورودی کاربر را بدون اعتبار سنجی و sanitize کردن در یک کوئری قرار دهید، مهاجم این توانایی را دارد که کوئری و خروجی را مطابق با خواسته خود تغییر دهد.
یک حمله موفق SQL Injection میتواند منجر به سرقت اطلاعاتی مثل: نام کاربری، رمز عبور، اطلاعات کارت اعتباری و یا هرگونه اطلاعات مهم و حساسی شود. در برخی موارد این حملات میتواند منجر به آسیب دیدن کل سرور شود.
سلام
میشه کاری کرد که کاربر هر جوری ورودی وارد کرد برنامه کوئری SQL رو تغییر نده و هک نشه؟
البته فکر کنم با دستورات آماده ای که معرفی کردین اینجوری میشه ولی خواستم مطمئن شم
سلام
نمی توان به صورت قطعی گفت.
اما می توانیم همیشه نوع داده را تعیین کنیم. با این کار ریسک حملات کاهش می یابد.
همچنین بخاطر اینکه سایت خوبی دارین و دنبال بهبود سایت هستین و مطلب جدید میذارین ممنون
خواهش میکنم. امیدوارم تو این مسیر موفق باشید.