Смешивание является специальным видом множественного наследования. Существует две основных ситуации, где mixins используются:
Для примера номера один, рассмотрите запрос 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
. Таким образом, класс был бы, вероятно, разработан для положения самостоятельно.
Я бы поискал несоответствие между кодировкой символов, используемой в вашем веб-интерфейсе, и кодировкой, используемой на уровне базы данных. Если ваш веб-интерфейс использует, например, UTF-8, а ваша база данных использует кодировку MySQL по умолчанию latin1
, то вам необходимо настроить свои таблицы с помощью DEFAULT CHARSET = utf8
.
Используйте mysql_real_escape_string ()
или mysqli, кстати. addlashes ()
не является НЕ адекватной защитой от SQL-инъекции.
'в 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?