Как лучше вставлять переменную в запрос?

Тема в разделе "Базы данных", создана пользователем verfaa, 21 июн 2015.

Статус темы:
Закрыта.
Модераторы: latteo
  1. verfaa

    verfaa

    Регистр.:
    29 янв 2007
    Сообщения:
    371
    Симпатии:
    41
    Просматриваю код в одном скрипте, там в запросах везде переменные вставляются путем конкантенации:

    Код:
     ... FROM settings WHERE id_user=".$user_id." AND confirm = '0' ... 
    У меня вопрос, как все же лучше вставлять переменную в запрос, методом выше или

    Код:
     ... FROM settings WHERE id_user={$user_id} AND confirm = '0' ... 
    Будет ли разница в скорости выполнения скрипта и будет ли эта разница существенной?
    По идее на конкантенацию строк тратятся ресурсы и время.
    PS переменная в запросе обработана выше функцией intval()
     
  2. Black Hat

    Black Hat Постоялец

    Регистр.:
    15 май 2015
    Сообщения:
    107
    Симпатии:
    69
    Оптимизация на спичках. Первый вариант быстрее. Еще быстрее - первый вариант, но заменить кавычки на одинарные.
    Пруф
     
    Горбушка и ZiX нравится это.
  3. Yuriy_Z

    Yuriy_Z Доработка+ OpenCart

    Регистр.:
    22 июл 2012
    Сообщения:
    158
    Симпатии:
    91
    если тип ячейки в БД интежер то кавичек ненадо, просто так
    AND confirm = 0
     
    Горбушка нравится это.
  4. BaBL

    BaBL Постоялец

    Регистр.:
    13 ноя 2012
    Сообщения:
    144
    Симпатии:
    87
    И так и так - плохо, если у тебя кто-то в переменную $user_id пропихнет слеш - получишь sqlInjection.

    Используй PDO или prepared statements в mysqli (mysqlnd). PDO универсальней

    http://php.net/manual/ru/pdo.prepared-statements.php

    PHP:
    $stmt $dbh->prepare('SELECT * FROM settings WHERE id_user=:user_id AND confirm = :confirm');
    $stmt->bindValue(':user_id'$user_id);
    $stmt->bindValue(':confirm'0);
    $stmt->execute();
    ну или покороче:

    PHP:
    $stmt $dbh->prepare('SELECT * FROM settings WHERE id_user=:user_id AND confirm = :confirm');
    $stmt->execute([
    ':user_id' => $user_id,
    ':confirm' => 0,
    ]);
     
    latteo и Black Hat нравится это.
  5. verfaa

    verfaa

    Регистр.:
    29 янв 2007
    Сообщения:
    371
    Симпатии:
    41
    Я знаю, но там тип не integer, а ENUM('0','1') - читал что если в поле всего несколько вариантов допустимо - ENUM эффективнее будет.
     
  6. Black Hat

    Black Hat Постоялец

    Регистр.:
    15 май 2015
    Сообщения:
    107
    Симпатии:
    69
    Очень плохой вариант. Во-первых, внутри енум тот же инт. Во-вторых, можно напутать и сильно вляпаться
     
    BaBL нравится это.
  7. sparsame

    sparsame Постоялец

    Регистр.:
    20 авг 2011
    Сообщения:
    85
    Симпатии:
    11
    Про * забудь вообще ..дырка для инъкций..
     
  8. BaBL

    BaBL Постоялец

    Регистр.:
    13 ноя 2012
    Сообщения:
    144
    Симпатии:
    87
    Очень интересно, можно хотя бы один пример такой инъекции?
     
  9. sparsame

    sparsame Постоялец

    Регистр.:
    20 авг 2011
    Сообщения:
    85
    Симпатии:
    11
  10. BaBL

    BaBL Постоялец

    Регистр.:
    13 ноя 2012
    Сообщения:
    144
    Симпатии:
    87
    Прошу прощения, но там я не нашел того, о чем вы говорите. Я просил показать вектор атаки именно на звездочку. В статье же описываются атаки на недостаточную фильтрацию данных.
     
    Black Hat нравится это.
Статус темы:
Закрыта.