Каково использование, “удаляют это”?

Я думаю, что если кто-то захочет использовать PHP и MySQL или какой-нибудь другой сервер базы данных:

  1. Подумайте об обучении PDO (объекты данных PHP) - это база данных уровень доступа, обеспечивающий единый метод доступа к нескольким базам данных.
  2. Подумайте об обучении MySQLi
  3. Используйте собственные функции PHP, такие как: strip_tags , mysql_real_escape_string или если переменная числовая, просто (int)$foo. Подробнее о типах переменных в PHP читайте здесь . Если вы используете библиотеки, такие как PDO или MySQLi, всегда используйте PDO :: quote () и mysqli_real_escape_string () .

Примеры библиотек:

---- PDO

----- Никакие заполнители - не спешили для SQL-инъекций! Это плохо

$request = $pdoConnection->("INSERT INTO parents (name, addr, city) values ($name, $addr, $city)");

----- Без имени заполнители

$request = $pdoConnection->("INSERT INTO parents (name, addr, city) values (?, ?, ?);

----- Именованные заполнители

$request = $pdoConnection->("INSERT INTO parents (name, addr, city) value (:name, :addr, :city)");

--- MySQLi

$request = $mysqliConnection->prepare('
       SELECT * FROM trainers
       WHERE name = ?
       AND email = ?
       AND last_login > ?');

    $query->bind_param('first_param', 'second_param', $mail, time() - 3600);
    $query->execute();

PS:

PDO побеждает в этом сражении с легкостью. Благодаря поддержке двенадцати различных драйверов баз данных и именованных параметров мы можем игнорировать небольшую потерю производительности и привыкнуть к ее API. С точки зрения безопасности, оба они являются безопасными, пока разработчик использует их так, как они должны использоваться

. Но хотя PDO и MySQLi довольно быстры, MySQLi выполняет незначительную скорость в тестах - ~ 2,5% для незаготовленных отчетов и ~ 6,5% для подготовленных.

И, пожалуйста, проверьте каждый запрос в своей базе данных - это лучший способ предотвратить инъекцию.

28
задан Sam 12 August 2014 в 08:09
поделиться

4 ответа

"удалите, это" является наиболее часто используемым для касательно считаемых объектов. Для касательно считаемого объекта решение о том, когда удалить, обычно помещается в сам объект. Вот пример того, на что метод Выпуска был бы похож [1].

int MyRefCountedObject::Release() {
  _refCount--;
  if ( 0 == _refCount ) {
    delete this;
    return 0;
  }
  return _refCount;
}

COM-объекты ATL являются главным примером этого шаблона.

[1] Да я понимаю, что это не ориентировано на многопотоковое исполнение.

32
ответ дан CesarB 28 November 2019 в 02:57
поделиться

delete this не допустимо в деструкторе. Это может использоваться в другом месте. Но это - только редко хорошая идея. wxWidgets платформа использует его для их класса потока. Это имеет режим, где, когда поток заканчивает выполнение, это автоматически освобождает системные ресурсы и его (объект wxThread). Я нашел его очень раздражающим, потому что снаружи, Вы не можете знать, допустимо ли это для обращения его или не - Вы не можете вызвать функцию как IsValid больше, потому что объект не существует. Это пахнет как основная проблема с delete this кроме проблемы, что это не может использоваться для нединамических объектов.

, Если Вы делаете это, удостоверьтесь, что Вы не касаетесь никакого элемента данных или больше называете любую функцию членства на объекте, Вы удалили тот путь. Лучше всего сделайте это как последний оператор в невиртуальной, защищенной или закрытой функции. Вызов удаляет, допустимо в виртуальной и/или государственной функции также, но я ограничил бы видимость метода, делающего это.

C++ FAQ имеет запись об этом. Кавычка Стандарта C++ на моем требовании выше (3.8p5):

, Прежде чем время жизни объекта запустилось, но после того, как устройство хранения данных, которое займет объект, было выделено или, после того, как время жизни объекта закончилось и перед устройством хранения данных, которое занятый объект снова использован или выпущен, любой указатель, который относится к месту хранения, где объект будет или был расположен, может использоваться, но только ограниченными способами. [...] , Если объект будет или был типа класса с нетривиальным деструктором, и указатель используется в качестве операнда удалять-выражения, программа имеет неопределенное поведение.

Время жизни заканчивается, когда деструктор объекта начинает выполнение. Примечание там является исключениями из правил, прибывающими после того абзаца для объектов в процессе строительства и разрушения (Вам разрешают получить доступ к нестатическим элементам данных, например), подробный в 12.7.

24
ответ дан seaotternerd 28 November 2019 в 02:57
поделиться

Там, где считавшийся серьезными основаниями сделать это в ранние дни C++. Например, сам удаляют касательно считаемого объекта (как JaredPar заявляет). Насколько я знаю, что они, как все находили, были плохой идеей в конечном счете.

3
ответ дан David Allan Finch 28 November 2019 в 02:57
поделиться

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

void RemoveAndDeallocate()
{
    LinkedListNode *current_prev = prev, *current_next = next;
    current_prev->next = current_next;
    current_next->prev = current_prev;
    delete this;
}

Хотя также разумно отделять узел от одного списка и связывать его с другим списком, не занимая при этом никакой памяти, поэтому не желательно, чтобы одна операция удаления приводила к безоговорочному освобождению памяти.

2
ответ дан 28 November 2019 в 02:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: