база данных не позволяет использовать специальные символы даже после использования mysqli_real_escape_string

Я нашел много вопросов, как это в SO и следовал за решением, но не работал в моем случае.

Я хочу вставить + в базу данных, поэтому я использовал

$tex5=mysqli_real_escape_string($connect_dude,$_POST['text5']);

Но это не вставляет +. Это дает пустое место (пробел) в базе данных.

Пожалуйста, будьте в курсе, я использую prepared statement а также parameterized query. Это причина, почему база данных не позволяет +? Если да, то как я могу это исправить?

Спасибо за ваше время.

Код

Javascript

//call con_edi() on first button clicked.insert email on text field and click button would fire off change5()

function con_edi(){
document.getElementById("alu").innerHTML="<input type='text'  id='taxi' style='border:1px solid black;'><input type='submit' id='' onclick='change5(taxi.value)' value='change'>";
}

function change5(s){
var form=s;
if(!form.match(/^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$/)){
alert("Wrong Email");
}else{
//document.write(form);  /*for testing the output*/
var ajax=new XMLHttpRequest();
ajax.open("post","contact.php",true);
ajax.setRequestHeader("content-type","application/x-www-form-urlencoded");
ajax.onreadystatechange=function(){
if(ajax.readyState == 4 && ajax.status == 200){

location.reload();

}
}

ajax.send("text5="+form);
}
}

PHP

$tex5=mysqli_real_escape_string($connect_dude,$_POST['text5']);
$query6="UPDATE `$database`.`header` SET email=?  WHERE user_id=?";

mysqli_stmt_prepare($stmt1, $query6);
mysqli_stmt_bind_param($stmt1, "si", $tex5, $logged_id);
mysqli_stmt_execute($stmt1);

1

Решение

Вам необходимо правильно кодировать URL-адрес отправляемого вами значения.

Прямо сейчас вы отправляете [email protected] — и в этом контексте URL, + является символом «замены» для символа пробела. Вот почему ваш скрипт вставлял символ пробела в базу данных, а не потому, что что-то не так с вставкой в ​​базу данных как таковой. (Хотя, как уже упоминалось, используя mysqli_real_escape_string в сочетании с подготовленными заявлениями является неправильно. mysqli_real_escape_string используется для маскировки специальных символов, которые вставляются непосредственно в синтаксис SQL, чтобы их нельзя было спутать с фактическим синтаксисом SQL. Однако при использовании подготовленных операторов с заполнителями команды и данные SQL отправляются в базу данных отдельно друг от друга, поэтому в этом контексте опасность не существует.)

Итак, вам нужно использовать

ajax.send("text5="+encodeURIComponent(form));

отправить ваши данные на сервер. encodeURIComponent заботится о правильном кодировании данных для контекста URL. Это сделает + персонаж в %2B, так что он может быть безопасно отправлен в этом контексте, и PHP будет декодировать его обратно в + автоматически.

1

Другие решения

РЕДАКТИРОВАТЬ: кажется, у вас есть дополнительная переменная, передаваемая в вашем подготовленном операторе, вы ожидаете 2 переменные, но вы передаете 3, удаление «si» из оператора bind должно исправить это.

mysqli_stmt_bind_param($stmt1, $tex5, $logged_id);

СТАРЫЙ ОТВЕТ: Предыдущий ответ, который я считаю неправильным (Извините!):

mysqli_real_escape_string() Функция удаляет только специальные символы, что и происходит в вашем случае; вам нужно конвертировать эти специальные символы в объекты HTML с htmlentities(),

$tex5=mysqli_real_escape_string($connect_dude,htmlentities($_POST['text5']));

Что бы превратить «+«к»&#43;«который должен быть добавлен в базу данных.

0

По вопросам рекламы [email protected]