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

У меня мало вопросов.

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

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

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

/**
     * 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 посещений сайта ежедневно. Или давайте предположим, что это сколько...


person PAujla03    schedule 26.01.2013    source источник
comment
Без обид, но этот вопрос (зачем мне) задавали уже тысячи раз. Почему бы не поискать немного сначала? например   -  person Your Common Sense    schedule 26.01.2013


Ответы (2)


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

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

Помимо вопроса «Почему я должен», на который уже был дан ответ, в вашем коде есть некоторые вещи, которые необходимо исправленный.

  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;
}
person Your Common Sense    schedule 26.01.2013
comment
Я не знаком с управлением соединениями. Есть ли у вас рекомендуемые учебники? Я тоже поищу в Интернете, но мне было интересно, есть ли у вас какие-либо предложения. В вашем примере выше, когда/где это соединение закрыто? Разве у меня не будет много соединений, если я не открою и не закрою его в используемой функции? - person PAujla03; 27.01.2013