【问题标题】:PHP function call from form not working来自表单的 PHP 函数调用不起作用
【发布时间】:2025-12-20 15:00:06
【问题描述】:

我正在尝试从同一个 .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>

知道为什么这不起作用吗?

【问题讨论】:

  • 因为 PHP 不是这样工作的?
  • 谢天谢地 selectQuery 没有被调用。它存在严重的 SQL 注入和 XSS 安全漏洞。

标签: php sql forms function html-table


【解决方案1】:

我没有看到你实际调用函数的位置,你只定义了它。您需要实现一个读取如下内容的块:

if (isset($_GET['action'])) {
    if ('selectQuery' == $_GET['action']) {
        选择查询();
    }
}

【讨论】:

  • 我从一个展示如何从表单操作按钮调用函数的示例中获取了这一点,但该函数位于单独的文件中。我虽然可以这样做,但不是引用单独的文件,而是将其替换为 index.php,
【解决方案2】:

如果您期望整数作为一年,请从 POST 超全局中获取它

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

并在您的选择函数中添加一个参数以获取年份,然后按照 SanHolo 建议的方式执行。

顺便说一句,请注意我在我提供的示例中将变量转换为整数( (int) 部分)。您拥有的代码是一个巨大的安全漏洞。您需要查找数据清理、SQL 注入和可能的参数化准备语句(查看 PDO)。

在您输入 $_POST['year_txt'] 的地方,有人可以将 ANYTHING 直接放入您的 SQL 语句中……例如,“90;delete from movies where 1;”。查看将创建的 SQL 语句!

永远不要打印出用户提供的输入,并且在没有先检查其完整性并对其进行清理之前,绝对不要将其放入 SQL 命令中。如果是数字,则转换为 int。如果您收到一个字符串,请使用 preg_replace 过滤掉任何奇数字符。您还可以使用某些 PHP filter_var 函数 - http://php.net/manual/en/function.filter-var.php

【讨论】:

  • 感谢安全指导。我确实意识到这将是公共网站上的一个问题,尽管这是一个个人项目并且将在我的家庭服务器上运行。我将是唯一一个使用它的人。不过,我仍在与代码作斗争,因此,如果您有任何进一步的指示,我将不胜感激。谢谢。
  • 当然。我将发布一个版本,展示更多我将如何做到这一点,将 SQL 函数与输出和程序逻辑分开。
【解决方案3】:

好的,这是一个重写的版本。当然它仍然不理想,但这应该会有所帮助。

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

【讨论】: