Дросселирование MySQL на изогнутых (умных) кавычках

Смешивание является специальным видом множественного наследования. Существует две основных ситуации, где mixins используются:

  1. Вы хотите обеспечить много дополнительных функций для класса.
  2. Вы хотите использовать одну конкретную функцию в большом количестве различных классов.

Для примера номера один, рассмотрите запрос werkzeug и система ответа . Я могу сделать простой объект запроса путем высказывания:

from werkzeug import BaseRequest

class Request(BaseRequest):
    pass

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

from werkzeug import BaseRequest, AcceptMixin

class Request(AcceptMixin, BaseRequest):
    pass

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

from werkzeug import BaseRequest, AcceptMixin, ETagRequestMixin, UserAgentMixin, AuthenticationMixin

class Request(AcceptMixin, ETagRequestMixin, UserAgentMixin, AuthenticationMixin, BaseRequest):
    pass

различие является тонким, но в вышеупомянутых примерах, смесительные классы не были сделаны стоять самостоятельно. В более традиционном множественном наследовании, AuthenticationMixin (например), вероятно, было бы что-то больше как Authenticator. Таким образом, класс был бы, вероятно, разработан для положения самостоятельно.

8
задан DisgruntledGoat 23 August 2009 в 15:56
поделиться

2 ответа

Я бы поискал несоответствие между кодировкой символов, используемой в вашем веб-интерфейсе, и кодировкой, используемой на уровне базы данных. Если ваш веб-интерфейс использует, например, UTF-8, а ваша база данных использует кодировку MySQL по умолчанию latin1 , то вам необходимо настроить свои таблицы с помощью DEFAULT CHARSET = utf8 .

Используйте mysql_real_escape_string () или mysqli, кстати. addlashes () не является НЕ адекватной защитой от SQL-инъекции.

7
ответ дан 5 December 2019 в 12:11
поделиться

'в Moe - это единственный символ в строке вашего примера, который не будет действительным, если эта строка закодирована в latin1, но ваш сервер mysql ожидает utf8.

Простая демонстрация:

<?php
function foo($s) {
    echo 'len=', strlen($s), ' ';
  for($i=0; $i<strlen($s); $i++) {
    printf('%02X ', ord($s[$i]));
  }
  echo "\n";
}

 // my file is latin1 encoded and so is the string literal
foo('Moe’s');
// now try it with an utf8 encoded string
foo( utf8_encode('Moe’s') );

печатает

len = 5 4D 6F 65 92 73
len = 6 4D 6F 65 C2 92 73

Следовательно, возникает вопрос: загружаете ли вы сервер mysql что-нибудь в "неправильной" кодировке?
Каждое соединение имеет кодировку соединения, и сервер mysql ожидает, что ваш клиент (скрипт php) отправит данные, закодированные в этом наборе символов. Вы можете узнать, какая кодировка соединения используется с

SHOW VARIABLES LIKE '%character%'

, как в

$mysql = mysql_connect('..', '..', '..') or die(mysql_error());
mysql_select_db('..', $mysql) or die(mysql_error());

$query = "SHOW VARIABLES like '%character%'";
$result = mysql_query($query, $mysql) or die(__LINE__.mysql_error());
while( false!==($row=mysql_fetch_array($result, MYSQL_ASSOC)) ) {
  echo join(', ', $row), "\n";
}

. Это должно напечатать что-то вроде

character_set_client, utf8
character_set_connection, utf8
character_set_database, latin1
character_set_filesystem, binary
character_set_results, utf8
character_set_server, utf8
character_set_system, utf8

и character_set_connection, utf8 указывает, что "мой" набор символов соединения - utf8, то есть mysql сервер ожидает от клиента символы в кодировке utf8 (php). Какая у вас кодировка подключения?

Затем посмотрите на фактическую кодировку вашей строки параметров, то есть если вы

$foo = mysql_real_escape_string($_POST['foo'], $mysql);

заменили ее на

echo '<div>Debug hex($_POST[foo])=';
for($i=0; $i<strlen($s); $i++) {
    printf('%02X ', ord($_POST['foo'][$i]));
}
echo "</div>\n";
$foo = mysql_real_escape_string($_POST['foo'], $mysql);

, и проверьте, какова фактическая кодировка вашей входной строки. Он печатает 92 или C2 92?

7
ответ дан 5 December 2019 в 12:11
поделиться
Другие вопросы по тегам:

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