Я нашел много вопросов, как это в 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);
Вам необходимо правильно кодировать URL-адрес отправляемого вами значения.
Прямо сейчас вы отправляете [email protected]
— и в этом контексте URL, +
является символом «замены» для символа пробела. Вот почему ваш скрипт вставлял символ пробела в базу данных, а не потому, что что-то не так с вставкой в базу данных как таковой. (Хотя, как уже упоминалось, используя mysqli_real_escape_string
в сочетании с подготовленными заявлениями является неправильно. mysqli_real_escape_string
используется для маскировки специальных символов, которые вставляются непосредственно в синтаксис SQL, чтобы их нельзя было спутать с фактическим синтаксисом SQL. Однако при использовании подготовленных операторов с заполнителями команды и данные SQL отправляются в базу данных отдельно друг от друга, поэтому в этом контексте опасность не существует.)
Итак, вам нужно использовать
ajax.send("text5="+encodeURIComponent(form));
отправить ваши данные на сервер. encodeURIComponent
заботится о правильном кодировании данных для контекста URL. Это сделает +
персонаж в %2B
, так что он может быть безопасно отправлен в этом контексте, и PHP будет декодировать его обратно в +
автоматически.
РЕДАКТИРОВАТЬ: кажется, у вас есть дополнительная переменная, передаваемая в вашем подготовленном операторе, вы ожидаете 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']));
Что бы превратить «+
«к»+
«который должен быть добавлен в базу данных.