लापता mysqli कनेक्शन संसाधन/वस्तु के अलावा स्क्रिप्ट के साथ कुछ अन्य मुद्दे भी हैं:
- यह एसक्यूएल इंजेक्शन से ग्रस्त है
- आप mysql कनेक्शन का परीक्षण नहीं कर रहे हैं जैसा कि http://docs.php पर दिखाया गया है। .net/mysqli.quickstart.connections
- स्क्रिप्ट में सामान्य रूप से त्रुटि प्रबंधन का अभाव है। कोई भी mysqli_* फ़ंक्शन/विधियां विफल हो सकती हैं। उदा.
mysqli_num_rows
. के बारे में चेतावनीmysqli_query
. के रिटर्न वैल्यू की जांच नहीं करने से संबंधित है । - आपका फ़ंक्शन test_input() कुछ भी परीक्षण नहीं करता है लेकिन मान बदलता है; और एक ईमेल पते का htmlspecialchars() et al से कोई लेना-देना नहीं है। बस उस समारोह को छोड़ दें।
- ईमेल पता सत्यापन स्पष्ट . के बिना अत्यधिक जटिल लगता है योग्यता।
- किसी ईमेल पते को दो बार डालने से रोकने के लिए SELECT/INSERT कॉम्बो के बजाय बस एक अद्वितीय अनुक्रमणिका उस फ़ील्ड पर और mysql सर्वर विश्वसनीय रूप से डुप्लिकेट को रोकेगा।
जैसे
<?php
define('MYSQL_ER_DUP_KEY', 1022); // see https://dev.mysql.com/doc/refman/5.6/en/error-messages-server.html#error_er_dup_key
$errors = array();
if($_POST) // might be superfluous
{
// simplified email validation
// improve if needed
$email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);
if ( !$email ) {
// removed html/style from error message, better do that when printing the error
$errors['email1'] = "A valid email address is required";
}
// you only need the database connection after the email address is validated
$mysqli = new mysqli('localhost', 'root', '','ecommerce');
// see http://docs.php.net/mysqli.quickstart.connections
if ($mysqli->connect_errno) {
trigger_error("Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error, E_USER_ERROR);
}
// not checking if this email address is already in the database
// instead create a unique index for that field
// see https://dev.mysql.com/doc/refman/5.6/en/constraint-primary-key.html
// - otherwise you'd at least have to lock the table to avoid race conditions -
// sql injections: see http://docs.php.net/security.database.sql-injection
// to prevent sql injections you either have to make sure string literals are
// properly encoded/escaped or use preparead statements+parameters
$stmt = $mysqli->prepare('INSERT INTO subscriptions (email) VALUES (?)');
if ( !$stmt ) {
trigger_error("prepare statement failed (" . $mysqli->errno . ") " . $mysqli->error, E_USER_ERROR);
}
else if ( !$stmt->bind_param('s', $email) ) {
trigger_error("bind_param failed (" . $stmt->errno . ") " . $stmt->error, E_USER_ERROR);
}
else if ( !$stmt->execute() ) {
// email has a unique index, inserting an email address a second time
// results in a ER_DUP_KEY error
if ( MYSQL_ER_DUP_KEY==$stmt->errno ) {
$errors['email2'] = "email address already in subsription list";
}
else { // otherwise it's "really" an error
trigger_error("execute failed (" . $stmt->errno . ") " . $stmt->error, E_USER_ERROR);
}
}
else {
[... inserted ...]
}
}