2013-01-26 3 views
1

У меня мало вопросов.Когда использовать подготовленные заявления?

Спецификация: база данных MySql; серверный язык PHP 5.3.10

1) Когда следует использовать подготовленные заявления?

Я создаю webapp, у которого есть пользователи. Я постоянно загружаю/вставляю данные в базу данных. В настоящее время я не использую подготовленные заявления, и мне было интересно, не так ли это?

/** 
    * Register a new user into the database. Please make sure to 
    * hash the password. 
    * @param type $fName First name of the user - String value. 
    * @param type $lName Last name of the user - String value. 
    * @param type $email Email address of the user - String value. 
    * @param type $hashedPassword - String value. 
    * @return boolean true if sucessful or false if failed. 
    */ 
    function registerUser($fName, $lName, $email, $hashedPassword) 
    { 
     //Establish a connection. 
     $mysqli = new $mysqli($GLOBALS['dbServer'], $GLOBALS['dbUserName'], $GLOBALS['dbPassword'], $GLOBALS['dbName']); 

     //Check if connection failed. 
     if($mysqli->connect_error) 
     { 
      die('Connect Error (' .$mysqli->connect_errno . ') ' 
        .$mysqli->connect_error); 
     } 

     //Insert data into the table and check if the attempt was sucessful. 
     if($mysqli->query("INSERT INTO user_info(email, password, fName, lName) VALUE ('$email', '$hashedPassword', '$fName', '$lName')")) 
     { 
      return true; 
     } 
     return false;    
    } 

Это правильный способ вставить значение в базу данных и убедиться, что он успешный? В качестве альтернативы, я могу использовать подготовленные заявления, и мне было интересно

2) как я могу использовать подготовленные заявления? И почему я должен (если вы предлагаете мне это делать)?

Я ожидаю примерно 20 000 посещений веб-сайта на ежедневной основе. Или давайте предположим, что сколько ...

+1

Не обижайся, но этот вопрос («почему я») было предложено в тысячи раз уже. Почему бы не искать сначала? [для exapmle] (http://stackoverflow.com/a/8265319/285587) –

ответ

0

Вы всегда должны были использовать подготовленные заявления. Это предотвратит любые шансы SQL-инъекции (при условии, что подготовка будет выполнена правильно). Я предполагаю, что вы также хотите знать, когда вы можете использовать регулярные запросы для повышения эффективности; аппаратное обеспечение всегда может быть обновлено. Остерегайтесь инъекции SQL второго порядка (example).

+0

Спасибо за эту ссылку. Я прочитал статью, и в настоящее время я делаю именно это. У меня была функция предотвращения инъекций XSS и SQL, но, как указывалось в статье, это не лучший способ сделать это. – PAujla03

0

Помимо вопроса «Почему я должен», which has been answered already, есть некоторые вещи в коде Юра, которые необходимо исправить.

  1. создание нового подключения к базе данных в каждой функции - это не путь.
    Создайте его где-нибудь в файле начальной загрузки, а затем используйте ключевое слово global для доступа к нему.
  2. Умирать в середине кода - это еще один нет-нет.
  3. Набивка многих операторов в одну строку не делает ничего хорошего, но делает код трудным для чтения и поддержки.
  4. В отличие от PDO, Mysqli не помогает в сокращении количества повторений в коде, поэтому программисту приходится заботиться.

так, эта функция будет как

function registerUser($fName, $lName, $email, $hashedPassword) 
{ 
    global $mysqli; 

    //Insert data into the table and check if the attempt was sucessful. 
    $sql = "INSERT INTO user_info(email, password, fName, lName) VALUES (?,?,?,?)"; 
    $sth = $mysqli->prepare($sql); 
    foreach (func_get_args() as $i => $value) { 
     $sth->bindValue($i+1, $value, PDO::PARAM_STR); 
    } 
    $mysqli->execute(); 
    return !$mysqli->error; 
} 
+0

Я не знаком с управлением соединениями. Есть ли у вас рекомендуемые учебные пособия? Я тоже буду искать в Интернете, но мне было интересно, есть ли у вас какие-либо предложения. В вашем примере выше, когда/где это соединение закрыто? Разве я не получаю много соединений, если я его не открою и не закрою в используемой функции? – PAujla03