با سلام و عرض ادب خدمت کاربران محترم سایت پی وی لرن. در این جلسه قصد داریم تا دستورات آماده در MySQL ، دستورات آماده در MySQLi و دستورات آماده در PDO را فرا بگیریم.
دستورات آماده در برابر SQL injection ها بسیار مفید هستند.
یک دستور آماده ویژگی هست که برای اجرای مشابه دستورات SQL بار ها و بار ها استفاده می شود.
دستورات آماده اساسا به این صورت کار می کنند:
دستورات آماده در مقایسه با دستورات مستقیم SQL سه مزیت اصلی دارند:
مثال زیر استفاده از دستورات آماده و پارامتر های مرتبط را در 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 "رکورد های جدید با موفقیت ساخته شدند"; $stmt->close(); $conn->close(); ?> |
توضیح خطوط کد بالا:
1 | "INSERT INTO MyGuests (firstname, lastname, email) VALUES (?, ?, ?)" |
ما یک علامت سوال (؟) در جایی که می خواهیم یک integer, string و double را جایگزین کنیم، درج کرده ایم.
1 | $stmt->bind_param("sss", $firstname, $lastname, $email); |
تابع ()bind_param پارامتر ها را به کوئری SQL وصل می کند.
آرگومان “sss” انواع داده پارامتر ها را لیست می کند. کاراکتر s مشخص می کند که پارامتر یک string یا رشته می باشد.
آرگومان می تواند یکی از پارامتر های زیر باشد:
با مشخص کردن نوع داده ای را که mysql انتظار آن را دارد، ریسک SQL injection را کاهش می دهیم.
نکته: اگر می خواهیم تا هر نوع داده ای را از ورودی های خارجی استفاده کنیم، حتما باید آن را اعتبار سنجی کنیم.
مثال زیر استفاده از دستورات آماده و پارامتر های مرتبط را در 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 "رکورد های جدید با موفقیت اضافه شدند"; } catch(PDOException $e) { echo "خطا: " . $e->getMessage(); } $conn = null; ?> |
جلسه کار با دستورات آماده در MySQL نیز به پایان رسید.
در جلسه بعد نحوه استفاده از دستور SELECT در MySQL را خواهیم آموخت.