Остановка сообщений пользователей более одного раза

Перед отправкой моей формы я проверяю базу данных, чтобы узнать, есть ли какие-либо предыдущие сообщения от пользователя. Если есть предыдущие сообщения, тогда сценарий отбросит сообщение, которое вы уже разместили.

Проблема в том, что то, что я пытаюсь достичь, не работает, все идет не так, как только после моего заявления else. Также существует вероятность того, что есть уязвимость в SQL-инъекции. Можете ли вы помочь?

<?php include '../login/dbc.php'; page_protect(); $customerid = $_SESSION['user_id']; $checkid = "SELECT customerid FROM content WHERE customerid = $customerid"; if ($checkid = $customerid) {echo 'You cannot post any more entries, you have already created one';} else $sql="INSERT INTO content (customerid, weburl, title, description) VALUES ('$_POST[customerid]','$_POST[webaddress]','$_POST[pagetitle]','$_POST[pagedescription]')"; if (!mysql_query($sql)) { die('Error: ' . mysql_error()); } echo "1 record added"; ?> 

$_SESSION , когда браузер будет закрыт. Поэтому я бы предложил использовать Cookies определенным образом.

Я обновил ваш код следующим образом:

 include '../login/dbc.php'; page_protect(); $customerid = $_COOKIE['user_id']; $checkid = "SELECT customerid FROM content WHERE customerid = $customerid"; if ($checkid = $customerid) {echo 'You cannot post any more entries, you have already created one';}else{ $sql="INSERT INTO content (customerid, weburl, title, description) VALUES ('$_POST[customerid]','$_POST[webaddress]','$_POST[pagetitle]','$_POST[pagedescription]')"; if (!mysql_query($sql)) die('Error: ' . mysql_error()); else echo "1 record added"; } 

Если вы беспокоитесь об инъекции, добавьте этот лакомый кусочек до вашего запроса на вставку:

 foreach($_POST as $key=>$value){ $_POST[$key] = addslashes($value); } 

Чтобы ответить на вторую часть вашего вопроса: да, вы очень уязвимы для SQL-инъекции :

 $sql="INSERT INTO content (customerid, ...) VALUES ('$_POST[customerid]', ...)"; ^ 

В этой статье объясняется SQL Injection и как избежать уязвимости в PHP.

Вам не хватает фигурных скобок {} :

 <?php if ($checkid == $customerid) {echo 'You cannot post any more entries, you have already created one';} else { $sql="INSERT INTO content (customerid, weburl, title, description) VALUES ('$_POST[customerid]','$_POST[webaddress]','$_POST[pagetitle]','$_POST[pagedescription]')"; if (!mysql_query($sql)) { die('Error: ' . mysql_error()); } echo "1 record added"; } ?> 

В дополнение к отсутствующим фигурным скобкам, упомянутым ранее, похоже, что вы назначаете в выражении if, что заставит оператор всегда оценивать значение true:

 if ($checkid = $customerid) {echo 'You cannot post any more entries, you have already created one';} 

Должно быть:

 if ($checkid == $customerid) {echo 'You cannot post any more entries, you have already created one';} 

Кроме того, $checkid содержит строку запроса SQL. Я предполагаю, что вы намереваетесь фактически запустить запрос и заполнить $checkid чем-то сопоставимым с $customerid прежде чем фактически перейти к сравнению.

В дополнение к SQL-инъекциям (человек, прочитайте книгу / учебник об этом перед запуском!) И отсутствующие фигурные скобки после else, у вас есть две ошибки: во-первых, вы не выполняете запрос $checkid , во-вторых, у вас есть только один = в if (поэтому вы назначаете значение $customerid $checkid .

Также существует вероятность того, что есть уязвимость в SQL-инъекции.

Почему «возможно»? Разве вы этого не видите? Разве вы не пишете свой код таким образом, чтобы избежать таких проблем в первую очередь?

Re: sql injection – всякий раз, когда вы доверяете данным своих пользователей, вы уязвимы. Возьмите инструкцию INSERT и дезинформируйте ее.

 $sql = sprintf("INSERT INTO content (customerid, weburl, title, description) VALUES ('%d','%s','%s','%s')", $_POST['customerid'], //forced as digit mysql_real_escape_string($_POST['webaddress']), mysql_real_escape_string($_POST['pagetitle']), mysql_real_escape_string($_POST['pagedescription']) ); 

Кроме того, вы должны использовать апострофы в своих ключах массива. В двойных кавычках это будет:

 echo "Post data webpage title is {$_POST['pagetitle']}";