У меня есть функция PHP для сохранения данных в БД. Данные содержат ñ и акценты, и эти данные извлекаются со сторонней страницы. Я пробовал много способов, и это не работает.
Это функция, которая у меня есть:
public function agregarProduct($name,$brand,$price){
$sql ="CALL spAddProduct('$name','$brand',$precio);";
$result= $this->_BD->query($sql);
$resultado->close();
$this->_BD->next_result();
}
Что я пробовал:
- Поместите заголовок в файл с указанием utf-8.
- я использовал
$name = utf8_encode($name);
. - Я также использовал функцию
mb_convert_encoding
. - Еще один, который я использовал, был
iconv(mb_detect_encoding($name, mb_detect_order(), true), "UTF-8", $name)
. - Я попытался изменить сопоставление БД на
utf8_general_ci
,utf8_spanish_ci
,uft8_default collation
. - Также в моей связи я использовал
$BD->query("SET NAMES 'utf8'");
и$BD->set_charset("utf8");
Ничего из вышеперечисленного не работало для меня в базе данных. Так как, например, если он $name
приходит в аргументе Maíz
, он сохраняется в базе данных как Maíz
, но если я печатаю его на экране, он отображается нормально (Кукуруза).
Я сделал попытку поставить по умолчанию значение $name
формы $name = "Maíz";
, чтобы она корректно добавлялась в базу данных.
Одно отличие, которое я нашел, заключается в следующем:
echo mb_detect_encoding($name = 'Maíz');
//esto devuelve UTF-8 y se ingresa correctamente a la BD
echo mb_detect_encoding($name); //$name viene como argumento de la funcion.
//esto devuelve ASCII y se ingresa con los caracteres raros
С этим наблюдением я хотел увидеть, что он возвращает ту же самую функцию при изменении переменной с помощью функций utf8_encode
, mb_convert_encoding
и iconv
результат для всех был ASCII
.
Как еще я мог решить эту ситуацию?
Проблема
Здорово, что вы проверили все кодировки символов (кодировку базы данных, PHP, все), прежде чем задавать вопрос, и что вы используете UTF-8. Таким образом, было легче увидеть, что вы получаете данные с объектами HTML , такими как
á
,í
и т. д. непосредственно из HTML и что это не ошибка кодирования . Кроме того, вы наверняка хорошо видите это на экране, потому что сам браузер показывает вам это соответствующим образом.Решение
Для декодирования (получения соответствующего символа) объектов HTML мы используем функцию html_entity_decode .
Код
Таким образом, мы можем использовать его для всех данных, которые вы получаете с сервера. В вашем примере для
$name
:Примечание по безопасности. Используемый вами код имеет серьезные проблемы с безопасностью. Прочтите, как использовать подготовленные операторы для построения запроса, всегда используя
mysqli
улучшенное расширение MySQL .после подключения к серверу просто введите одну строку, как в следующем примере:
Отсюда вы уже можете размещать свои запросы и другие, которые вы хотите использовать
ПРИМЕЧАНИЕ. Мои поля mysql представляют собой текст с сопоставлением
latin1_swedish_ci
.Другой вариант, что вы используете
utf8_decode()
, вы использовалиutf8_encode()
. НапримерТо, что вы вводите, например, (аист -> имеет Ü и Ñ), вы сохраняете в переменной. затем, прежде чем использовать эту переменную в вашем sql-запросе, вы применяете к ней utf8_decode(). Например, $variable = utf8_decode($variable);
перед сохранением в базу данных (неопределенная сортировка) вы можете преобразовать символы в объекты HTML
затем в файле php добавьте следующий заголовок
Таким образом, не нужно будет снова преобразовывать данные перед их визуализацией.