2016-03-12 3 views
-1

Я получаю текст из базы данных в UTF-8 с помощью JSON, и он находится в файле прямо сейчас. При печати данных это:Все значения данных JSON не вставляются в базу данных MySQL (для символов UTF-8)

توحید در نگاه امام علی (علیه السلام)

Но когда я вставляю его в базе данных я получаю эту ошибку:

Insertion 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 '�وحید در نگاه امام علی ' at line 1

Это мой код

<?php 
header('Content-Type: application/json; charset=utf-8'); 
$con = mysql_connect("localhost","bbbbbbb","bbbbbbb"); 
mysql_select_db("db", $con); 
if(file_exists('./json/file.json')){ 
    $jsondata = file_get_contents('./json/file.json'); 
    $data = json_decode($jsondata, true); 
    foreach ($data['nodes'] as $node){ 
     $data_element = $node['node']; 
     $title = $data_element['title']; 
     $summary = $data_element['summary']; 
     $body = $data_element['body']; 
     $id = $data_element['id']; 
     print $title."\n"; 
     $insert = "INSERT INTO main(title) VALUES ($title)"; 
     mysql_query($insert) or die("Insertion Error: ". mysql_error()); 
    } 
} 
else 
    print "File doesn't exist"; 

База данных и ее столбцов все utf8_general_ci. Почему печатный текст не такой, как тот, который вставлен в базу данных?

+0

Я не могу понять, как это может работать, если вы делаете этот запрос - «INSERT INTO main (title) VALUES (توحید در نگاه امام علی (علیه السلام))». Является ли он уязвимым для инъекций sql? – degr

+1

'$ insert =" INSERT INTO main (title) VALUES ($ title) ";' просто не будет работать, потому что в '$ title' нет кавычек. –

+0

@RickJames это именно то, что я пропустил – Drupalist

ответ

2

Соединение с базой данных должно знать, что это также utf8. mysql_set_charset('utf8').

Вместо устаревшего mysql_con вы должны взглянуть на mysqli.

+1

Отличный ответ, но, пожалуйста, вы можете отредактировать это, чтобы включить предупреждение об устаревшем расширении mysql –

+0

Конечно, спасибо! – ericwenn

+0

Я пробовал, но это дало мне эту ошибку 'Ошибка: (1064) У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с 'در نگاه امام علی (علیه السلام))' в строке 1' – Drupalist

1

использование этого

$mysqli = new mysqli("localhost","root","","your_db_name"); 

$mysqli->query("SET NAMES 'utf8'"); 

$ mysqli-> запрос ("SET CHARACTER SET utf8");

+0

Вы можете это сделать, но в этом случае эти запросы будут выполняться по каждому запросу, поэтому 10000 запросов будут равны 20000 дополнительным запросам. Лучше сконфигурируйте сервер sql для использования в глобальном масштабе, чем каждый раз. – degr

+0

это устанавливается только один раз в config.php и включает конфигурацию один раз на странице –

+0

Хотя этот фрагмент кода может решить вопрос, [включая объяснение] (http://meta.stackexchange.com/questions/114762/explaining-entirely- на основе кода) действительно помогает улучшить качество вашего сообщения.Помните, что вы отвечаете на вопрос читателей в будущем, и эти люди могут не знать причин вашего предложения кода. – SmokeDispenser

1

Несмотря на то, что @ericwenn и @SahilManchal поднимают действительные баллы, непосредственной ошибкой является процитирование строки в ... VALUES ($title) ....

Не слепо положите строку в запрос.

Это будет работать, но это не сейф: ... VALUES ('$title') .... Он подлежит взлому под названием «sql injection». См. real_escape_string.

Кроме того, после подключения с MySQLi, использовать

$mysqli->set_charset('utf8'); 

То есть предпочтительно SET NAMES.

+0

Я пробовал, но это дало мне эту ошибку 'Ошибка: (1064) You ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с 'در نگاه امام علی (علیه السلام))' в строке 1' – Drupalist

Смежные вопросы