php, MySQL и переменные, содержащие ошибки ä, ä и ö - PullRequest
1 голос
/ 13 августа 2010

У меня возникли некоторые проблемы с синтаксисом SQL / переменными экранирования на моем сервере LAMP.

Я хочу использовать следующую команду:

$sql=mysql_query("INSERT INTO '$table' (FirstName, LastName, StartDate, TimeStroke, DueDate, Duration, Price, Retailer, Checksum)
VALUES ('$_POST[firstname]','$_POST[lastname]','$_POST[startdate]','$_POST[timestroke]','$duedate','$_POST[duration]','$price','$_SESSION[name]','$random')");

Проблема заключается виногда переменная $ table содержит символы типа å, ä и ö.Следовательно, мне нужно поставить '' вокруг таблицы $, чтобы убедиться, что она остается прежней.Однако при этом получаются сообщения об ошибке:

"Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''tablename' (FirstName, LastName, StartDate, TimeStroke, DueDate, Duration, P' at line 1".

Похоже, что экранирование с помощью '' создает проблему.Я пытался заменить запрос на mysql_real_escape_string:

"$sql=sprintf("INSERT INTO '".mysql_real_escape_string($table)."' (FirstName, [...]" 

, но это мне тоже не помогает.Есть ли способ сохранить данные в переменной без изменений и при этом иметь возможность выполнять запрос?Или я должен признать, что å, ä, ö запрещены в php / MySQL?

Ответы [ 2 ]

2 голосов
/ 13 августа 2010

Это делается для кодировки символов. Проверить http://www.sitepoint.com/blogs/2006/03/15/do-you-know-your-character-encodings/


Поставьте header('Content-Type: text/html; charset=utf-8'); вверху страницы

Также попробуйте сделать mysql_set_charset('utf8'); перед вставкой / чтением из БД. Затем вы должны поместить в форму, которая публикует ваш файл PHP, следующее:

<form action="/your-post-controller.php" method="post" accept-charset="utf-8">

Обратите внимание на accept-charset = "utf-8 - это очень важно, иначе ваш заголовок будет сообщать файлу PHP его значение в латинице1

Тогда должно сработать.

Также взгляните на http://www.phpwact.org/php/i18n/charsets - пытался найти ссылку, которую, безусловно, стоит прочитать для всех, кто заинтересован в правильной кодировке символов, см. Строку Iñtërnâtiônàlizætiøn для тестирования таблицы PHP и MySQL

1 голос
/ 13 августа 2010

Вы должны использовать backticks (`), чтобы окружить имя таблицы.Ничего общего с кодировкой символов:

$sql=mysql_query("INSERT INTO `$table` (FirstName, LastName, StartDate, TimeStroke, DueDate, Duration, Price, Retailer, Checksum)
VALUES ('{$_POST['firstname']}','{$_POST['lastname']}','{$_POST['startdate']}','{$_POST['timestroke']}','$duedate','{$_POST['duration']}','$price','{$_SESSION['name']}','$random')");

Несколько замечаний здесь:

A: вы должны действительно использовать mysql_real_escape_string для любого ввода, поступающего из неизвестного источника, чтобы избежать уничтожения кого-либоваша база данных с SQL-инъекцией.

B: Вы должны использовать 'вокруг ассоциативных индексов массива, причина в том, что все они будут генерировать неопределенные постоянные (или что-то в этом роде) ошибки.Который заполнит ваш журнал ошибок и сделает поиск более критических ошибок немного сложнее, если вам когда-нибудь потребуется вернуться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...