2009-10-25 3 views
0

Я пытаюсь вызвать функцию из формы внутри того же .php-файла, но при нажатии кнопки «Отправить» таблица не генерируется.вызов функции 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> 

Любая идея, почему это не работает?

+4

потому что это не так, как работает PHP? – workmad3

+1

Благодарить 'selectQuery' не вызывается. Он имеет серьезные SQL-инъекции и дыры в безопасности XSS. – bobince

ответ

2

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

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

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

BTW, note Я передал переменную целому числу (часть (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

Спасибо за указания безопасности. Я понимаю, что это будет проблемой на общедоступном веб-сайте, хотя это личный проект и будет работать на моем домашнем сервере. Я буду единственным, кто его использует. Тем не менее, я все еще борюсь с кодом, поэтому, если у вас есть какие-либо дальнейшие указания, я бы очень оценил. Благодарю. – TuxMeister

+0

Несомненно. Я опубликую версию, которая показывает, как я это сделаю, отделяя функцию SQL от логики вывода и программы. – JAL

6

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

if (isset($_GET['action'])) { 
    if ('selectQuery' == $_GET['action']) { 
     selectQuery(); 
    } 
}
+0

Я взял это из примера, который показал, как вызвать функцию из кнопки действия формы, но функция была в отдельном файле. Я, хотя я был бы в состоянии сделать то же самое, но вместо ссылки на отдельный файл, просто замените его на index.php, – TuxMeister

0

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

<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>