Можете ли вы использовать $ _POST в предложении WHERE - PullRequest
0 голосов
/ 27 октября 2011

На самом деле нет прямых и прямых ответов на этот вопрос, поэтому я подумал, что попробую.

$myid = $_POST['id'];

       //Select the post from the database according to the id.
   $query = mysql_query("SELECT * FROM repairs WHERE id = " .$myid . " AND name = '' AND email = '' AND address1 = '' AND postcode = '';") or die(header('Location: 404.php'));

Предполагается, что приведенный выше код устанавливает переменную $ myid в качестве отправляемого содержимого id, затем эта переменная используется в предложении SQL WHERE для извлечения данных из базы данных в соответствии с представленным идентификатором. Забывая потенциальные SQL-инъекции (я исправлю их позже), почему именно это не работает?

Хорошо, вот полный код моего теста:

<?php

//This includes the variables, adjusted within the 'config.php file' and the functions from the 'functions.php' - the config variables are adjusted prior to anything else.
require('configs/config.php');
require('configs/functions.php');

//Check to see if the form has been submited, if it has we continue with the script.
if(isset($_POST['confirmation']) and $_POST['confirmation']=='true')
{
    //Slashes are removed, depending on configuration.
    if(get_magic_quotes_gpc())
    {
        $_POST['model'] = stripslashes($_POST['model']);
        $_POST['problem'] = stripslashes($_POST['problem']);
        $_POST['info'] = stripslashes($_POST['info']);
    }
    //Create the future ID of the post - obviously this will create and give the id of the post, it is generated in numerical order.
    $maxid = mysql_fetch_array(mysql_query('select max(id) as id from repairs'));
    $id = intval($maxid['id'])+1;

    //Here the variables are protected using PHP and the input fields are also limited, where applicable.
    $model = mysql_escape_string(substr($_POST['model'],0,9));
    $problem = mysql_escape_string(substr($_POST['problem'],0,255));
    $info = mysql_escape_string(substr($_POST['info'],0,6000));

    //The post information is submitted into the database, the admin is then forwarded to the page for the new post. Else a warning is displayed and the admin is forwarded back to the new post page. 
    if(mysql_query("insert into repairs (id, model, problem, info) values ('$_POST[id]', '$_POST[model]', '$_POST[version]', '$_POST[info]')"))
    {

?>

<?php

$myid = $_POST['id'];

       //Select the post from the database according to the id.
   $query = mysql_query("SELECT * FROM repairs WHERE id=" .$myid . " AND name = '' AND email = '' AND address1 = '' AND postcode = '';") or die(header('Location: 404.php'));

       //This re-directs to an error page the user preventing them from viewing the page if there are no rows with data equal to the query.
   if( mysql_num_rows($query) < 1 )
{
 header('Location: 404.php');
 exit;
}

   //Assign variable names to each column in the database.
   while($row = mysql_fetch_array($query))
   {
       $model = $row['model'];
       $problem = $row['problem'];
   }

           //Select the post from the database according to the id.
   $query2 = mysql_query('SELECT * FROM devices WHERE version = "'.$model.'" AND issue = "'.$problem.'";') or die(header('Location: 404.php'));

       //This re-directs to an error page the user preventing them from viewing the page if there are no rows with data equal to the query.
   if( mysql_num_rows($query2) < 1 )
{
 header('Location: 404.php');
 exit;
}

   //Assign variable names to each column in the database.
   while($row2 = mysql_fetch_array($query2))
   {
       $price = $row2['price'];
       $device = $row2['device'];
       $image = $row2['image'];
   }

?>  

<?php echo $id; ?>
<?php echo $model; ?>
<?php echo $problem; ?>
<?php echo $price; ?>
<?php echo $device; ?>
<?php echo $image; ?>

    <?  
    }
    else
    {
        echo '<meta http-equiv="refresh" content="2; URL=iphone.php"><div id="confirms" style="text-align:center;">Oops! An error occurred while submitting the post! Try again…</div></br>';
    }
}
?>

Ответы [ 4 ]

2 голосов
/ 27 октября 2011

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

$query = msql_query("SELECT * FROM repairs WHERE id = '$myid' AND...")

Редактировать: Также вам не нужно использовать конкатенацию со строкой в ​​двойных кавычках.

0 голосов
/ 27 октября 2011

Использование $something = mysql_real_escape_string($POST['something']);
Обеспечивает ли не только предотвращение SQL-инъекций, но и предотвращает синтаксические ошибки, связанные с тем, что люди вводят такие данные, как:

name = O'Reilly    <<-- query will bomb with an error
memo = Chairman said: "welcome"   
etc.

Таким образом, чтобыдействительное и работающее приложение, оно действительно необходимо.
Аргумент "I'll fix it later" имеет несколько логических недостатков:

  • Исправлять вещи медленнее, вы будете тратить больше времени в целом, потому что вынужно пересмотреть старый код.
  • Вы получите ненужные отчеты об ошибках в тестировании из-за функциональных ошибок, упомянутых выше.
  • Я сделаю это позже, вещи, как правило, никогда не случаются.
  • Безопасность не является обязательной, она необходима.
  • Что произойдет, если вы отстранитесь от проекта, и кто-то другой должен вступить во владение, он (а) не узнает о ваших нерешенных проблемах.
  • Если вы что-то делаете, закончите, не оставляйте все виды проблем нерешенными.
  • Если бы я был вашим начальником и провёл проверку кода по этому коду, вас бы уволили на месте.
0 голосов
/ 27 октября 2011

Единственная причина $myid была бы пустой, если она не отправлена ​​браузером. Убедитесь, что для действия формы установлено значение POST. Вы можете проверить, есть ли значения в $_POST с помощью следующего:

print_r($_POST);

И, повторите ваш запрос, чтобы убедиться, что это именно то, что вы ожидаете. Попробуйте запустить его вручную через PHPMyAdmin или MySQL Workbench.

0 голосов
/ 27 октября 2011
  1. Проверьте значение $ myid и всю динамически созданную строку SQL, чтобы убедиться, что она содержит то, что, по вашему мнению, содержит.

  2. Вероятно, ваша проблемавозникает в результате использования сравнения пустых строк для столбцов, которые, вероятно, содержат значения NULL.Попробуйте name IS NULL и т. Д. Для всех пустых строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...