2013-05-17 5 views
2

Прежде чем кто-нибудь скажет, я защищу себя от инъекций SQL сразу после исправления этой ошибки. Я делаю приложение, в котором в базу данных отправляются новостные сообщения. Эта страница удаляет отчет из базы данных.Как использовать переменные PHP в инструкции SQL

Что я пробовал: Все возможные варианты добавления скобок к SQL и речевым меток. Мой учитель по ИКТ, и я смотрел на это почти 2 часа и не могу найти исправление. Я также искал Google и переполнение стека, но я не могу найти ответ.

Хорошо, поэтому отображается правильный report_id, когда я его эхо. Когда я помещаю фактический идентификатор, например 5, отчет удаляется. Но когда я помещаю $ report_id, ничего не удаляется.

Возможно, кто-нибудь скажет мне, какую коррекцию мне нужно сделать, чтобы заставить это работать?

Вот код (EDIT: Это фиксированный код, который я добавил скрытое поле в форме на дне, среди нескольких других небольших изменений (например, вынимая дополнительный тэг формы).):

<?php 
    require_once('authorize.php'); 
?> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> 
<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
    <title>Football Central - Remove a Report</title> 
</head> 
<body> 
    <h2>Football Central - Remove a News Report</h2> 

<?php 
    require_once('img_details_reports.php'); 
    require_once('connect_db_reports.php'); 

    //Assign variables from admin_reports.php using $_GET 
    $report_id = $_GET['id']; 

    if (isset($_POST['submit'])) { 
    if ($_POST['confirm'] == 'Yes') { 

     $report_id = $_POST['id']; 
     // Delete the image file from the server 
     @unlink(IMAGE_UPLOADPATH . $image); 

     // Connect to the database 
     $dbc = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME) 
     or die("Unable to connect to the database."); 

     // Delete the score data from the database 
     $query = "DELETE FROM news_reports WHERE report_id = '".$report_id."' LIMIT 1" 
     or die("mysql_query failed - Error: " . mysqli_error()); 

     mysqli_query($dbc, $query) or die("mysql_query failed - Error: " . mysqli_error()); 
     mysqli_close($dbc); 
    } 
    }   

    //Display form to confirm delete 
    echo '<p>Are you sure you want to delete the news report?</p>'; 
    echo '<form method="post" action="removereport.php">'; 
    echo '<input type="radio" name="confirm" value="Yes" /> Yes '; 
    echo '<input type="radio" name="confirm" value="No" checked="checked" /> No <br />'; 
    echo '<input type="hidden" name="id" value="' . $report_id . '" />'; 
    echo '<input type="submit" value="Submit" name="submit" />'; 
    echo '</form>'; 

    echo '<p><a href="admin_reports.php">&lt;&lt; Back to admin reports page</a></p>'; 
?> 

</body> 
</html> 
+7

+1 для предварительной утомляемости скучной проповеди SQL-инъекции – imulsion

+1

Как вы отправляете переменную 'id'? – SAVAFA

+0

Я предполагаю, что у вас есть var, submit, confirm и id существует, правильно .... попробуйте сделать эхо каждого из них в начале вашего php-скрипта – Hackerman

ответ

0

Вы отправляете form с post метода и извлечения его с get. Это может быть источником проблемы.

Кроме того, вы не посылаете параметр id так, что не будет никакого значения для $_get[id] ни $_post[id]

+0

но я не вижу никакого ввода name = "id" там? – bwoebi

+0

Метод формы по умолчанию - GET ([см. Этот ответ] (http://stackoverflow.com/questions/2314401/what-is-the-default-form-posting-method)), но ваша точка зрения об отсутствии 'id' id действителен. –

+0

Вы правы относительно значения по умолчанию, но он устанавливает метод как 'post' уже – SAVAFA

3

Вы смешиваете два утверждения. Просто попробуйте ниже.

// Delete the score data from the database 
    $query = "DELETE FROM news_reports WHERE report_id = ".$report_id; 
    mysqli_query($dbc, $query) or die("mysql_query failed - Error: " . mysqli_error($dbc)); 
+1

+1. Это правильный ответ. оператор 'die' неуместен – Matanya

+0

@Matanya Это верно, но строка должна оцениваться как логическая, поэтому это не вызовет проблемы ... – bwoebi

+0

Правильно ли это для отправки ссылки на базу данных, см. ее здесь: http: //php.net/manual/en/mysqli.query.php – SAVAFA

0

Вы не должны обернуть ID в одинарные кавычки, если идентификатор является числом.

$query = "DELETE FROM news_reports WHERE report_id = '".$report_id."' LIMIT 1" 

Но это не проблема. Вы не указали идентификатор в запросе на подтверждение или не получили возможность извлекать значение из переменной сеанса. Добавьте скрытое поле ввода с идентификатором в разделе «Показать форму для подтверждения удаления».

(И есть другой код ветви для подтверждения! И тест на недопустимый ID! И переместить это POST, по крайней мере!)

+0

Спасибо за это! Когда я использую POST, идентификатор не извлекается, только с GET. Вы знаете, почему это так? – lukecolli98

0

Вы получили

$query = "..." or die(...); 

Почему ?

Кроме того, у вас есть теги для открытия двух форм - это не относится к формам гнезда.

Я собираюсь предположить, что переменная id поступает из какого-либо источника, кроме формы, потому что нет элемента формы, который его отправляет.

Наконец, не забудьте указать get или post в вашей форме. Я бы рекомендовал использовать post, а затем изменить $_GET["submit"] и $_GET["confirm"] на $_POST["submit"] и $_POST["confirm"].

+0

Привет, или умереть, чтобы увидеть, могу ли я получить точную проблему :) Когда я использую POST, идентификатор не извлекается, только с GET. Вы знаете, почему это так? – lukecolli98

0

Вам необходимо проверить следующие действия в коде.

  • Где ваш ID элемент в виде
  • Вы поставили метод POST в форме, но извлечение данных из $ _GET, вы должны изменить его $ _POST.
  • Положите mysqli_error после инструкции mysqli_query.

    $query = "DELETE FROM news_reports WHERE report_id = ".$report_id; 
    
    mysqli_query($dbc, $query); or die("mysql_query failed - Error: " . mysqli_error()); 
    

Затем проверьте ошибку от MySQL, если он не работает.

Надеюсь, это поможет вам в решении вашей проблемы.

+0

Привет, я добавил идентификатор в форму, и он отлично работает! Когда я использую POST, идентификатор не извлекается, только с GET. Вы знаете, почему это так? – lukecolli98

Смежные вопросы