Вызов функции PHP из формы не работает - PullRequest
0 голосов
/ 25 октября 2009

Я пытаюсь вызвать функцию из формы в том же файле .php, но когда нажата кнопка «Отправить», таблица не генерируется.

Вот код:

<p>
<?php
function selectQuery()
{
    $con = mysql_connect("localhost","readonly","");
    if (!$con)
    {
      die('Could not connect: ' . mysql_error());
    }

    mysql_select_db("mediadb", $con);
    $result = mysql_query("SELECT title, director FROM movies WHERE year = '$_POST[year_txt]'");
    echo "<table border='1' background='lightgray'>
        <tr>
            <th>Title</th>
            <th>Director</th>
        </tr>";

    while($row = mysql_fetch_array($result))
    {
      echo "<tr>";  
      echo "<td>" . $row['title'] . "</td>";
      echo "<td>" . $row['director'] . "</td>";
      echo "</tr>";
    }
    echo "</table>";
    mysql_close($con);
}
?>
</p>
<p>
<!-- start of entry form -->
<form action="index.php?action=selectQuery" method="post">
Year: <input type="text" name="year_txt" />
<input type="submit"/>
</form>
<!-- end of entry form -->
</p>

Есть идеи, почему это не работает?

Ответы [ 3 ]

6 голосов
/ 25 октября 2009

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

if (isset($_GET['action'])) {
    if ('selectQuery' == $_GET['action']) {
        selectQuery();
    }
}
2 голосов
/ 25 октября 2009

Если вы ожидаете целое число как год, получите его из суперглобального значения POST как

$year=(int)$_POST['year_txt'];

И добавьте параметр в свою функцию выбора, чтобы взять год, а затем выполните, как предложил СанХоло.

Кстати, обратите внимание, я приведу переменную к целому числу (часть (int)) в представленном мною примере. Код, который у вас есть, является огромной дырой в безопасности. Вам необходимо проверить очистку данных, внедрение SQL и, возможно, параметризованные подготовленные операторы (проверьте PDO).

Когда вы вставляете $ _POST ['year_txt'], кто-то может вставить НИЧЕГО прямо в ваш оператор SQL ... Например, «90; удалить из фильмов, где 1;». Проверьте оператор SQL, который будет создан!

Не когда-либо распечатывать введенные пользователем входные данные и ОБЯЗАТЕЛЬНО не помещать их в команду SQL, не проверив их на предмет работоспособности и не очистив. Если это число, приведите к int. Если вы получаете строку, используйте preg_replace для фильтрации любых нечетных символов. Вы также можете использовать определенные функции PHP filter_var - http://php.net/manual/en/function.filter-var.php

0 голосов
/ 25 октября 2009

Хорошо, вот переписанная версия. Конечно, это все еще не идеально, но это должно помочь.

<html>
<head><title>Movies, yo</title></head>
<body>

<?php
$year=(int)$_POST['year_txt'];

function selectQuery($year)
  {
  $con = mysql_connect("localhost","readonly","");
  if (!$con)
    {
    die('Could not connect: ' . mysql_error());
    }

  mysql_select_db("mediadb", $con);
  $result = mysql_query("SELECT title, director FROM movies WHERE year = $year");

  $movie_results=array();

  while($row = mysql_fetch_array($result))
   {
   $movie_results[]=$row;
   }

  mysql_close($con);

  return $movie_results;
  }

function print_movies($movie_array)
  { ?>
  <table border='1' background='lightgray'>
    <tr>
     <th>Title</th>
     <th>Director</th>
    </tr>
  <?php
  foreach($movie_array as $a_movie)
    { ?>
    <tr>
     <td><?php echo $a_movie['title'];?></td>
     <td><?php echo $a_movie['director'];?></td>
    </tr>
    <?php
    }//end foreach movie_array?>
  </table>
  <?php
  }?>

<p>
<!-- start of entry form -->
<form action="index.php" method="post">
Year: <input type="text" name="year_txt" value='<?php echo $year;?>'/>
<input type='hidden' value='selectQuery' name='action'/>
<input type="submit"/>
</form>
<!-- end of entry form -->
</p>

<?php

 if ('selectQuery'==$_POST['action'])
  {
  if ($year>0)

$movie_results=selectQuery($year);
    if(!empty($movie_results))
      {
      print_movies($movie_results);
      }
else
      {
      echo "No movie was found for $year<br>";
      }
    }//end if 'year is valid'
  else
    {
    echo "Please enter a valid year<br>";
    }
  }//end if 'action was selectQuery'
?>
</body>
</html>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...