Перед отправкой моей формы я проверяю базу данных, чтобы узнать, есть ли какие-либо предыдущие сообщения от пользователя. Если есть предыдущие сообщения, тогда сценарий отбросит сообщение, которое вы уже разместили.
Проблема в том, что то, что я пытаюсь достичь, не работает, все идет не так, как только после моего заявления 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']}";