フォームからのPHP関数呼び出しが機能しない
-
06-07-2019 - |
質問
同じ.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 = '同じ.phpファイル内のフォームから関数を呼び出そうとしていますが、[送信]ボタンがクリックされたときにテーブルが生成されません。
コードは次のとおりです。
<*>
これが機能しない理由は何ですか?
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>
これが機能しない理由は何ですか?
解決
年として整数が必要な場合は、POSTスーパーグローバルから取得します
$year=(int)年として整数が必要な場合は、POSTスーパーグローバルから取得します
<*>
選択機能にパラメーターを追加して年を取得し、SanHoloが提案した方法を実行します。
ところで、私が提供した例では、変数を整数((int)部分)にキャストしていることに注意してください。あなたが持っているコードは巨大なセキュリティホールです。データのサンタン化、SQLインジェクション、およびおそらくパラメーター化された準備済みステートメントを調べる必要があります(PDOをチェックしてください)。
$ _ POST ['year_txt']を入力すると、誰かがSQLステートメントに何かを直接入力できます。たとえば、「90; delete from movies where 1;&quot;」のようになります。作成されるSQLステートメントをチェックしてください!
ユーザーが提供した入力を ever 印刷しないでください。また、最初に健全性をチェックしてサニタイズするまでは、SQLコマンドに入力しないでください。数値の場合、intにキャストします。文字列を受け取っている場合は、preg_replaceを使用して、奇妙な文字を除外します。特定のPHP filter_var関数も使用できます- http://php.net/manual /en/function.filter-var.php
POST['year_txt'];
選択機能にパラメーターを追加して年を取得し、SanHoloが提案した方法を実行します。
ところで、私が提供した例では、変数を整数((int)部分)にキャストしていることに注意してください。あなたが持っているコードは巨大なセキュリティホールです。データのサンタン化、SQLインジェクション、およびおそらくパラメーター化された準備済みステートメントを調べる必要があります(PDOをチェックしてください)。
$ _ POST ['year_txt']を入力すると、誰かがSQLステートメントに何かを直接入力できます。たとえば、「90; delete from movies where 1;&quot;」のようになります。作成されるSQLステートメントをチェックしてください!
ユーザーが提供した入力を ever 印刷しないでください。また、最初に健全性をチェックしてサニタイズするまでは、SQLコマンドに入力しないでください。数値の場合、intにキャストします。文字列を受け取っている場合は、preg_replaceを使用して、奇妙な文字を除外します。特定のPHP filter_var関数も使用できます- http://php.net/manual /en/function.filter-var.php
他のヒント
実際に関数を呼び出す場所はわかりません。定義するだけです。次のようなブロックを実装する必要があります。
if (isset(実際に関数を呼び出す場所はわかりません。定義するだけです。次のようなブロックを実装する必要があります。
<*>GET['action'])) { if ('selectQuery' ==実際に関数を呼び出す場所はわかりません。定義するだけです。次のようなブロックを実装する必要があります。
<*>GET['action']) { selectQuery(); } }
さて、ここに書き直したバージョンがあります。もちろん理想的ではありませんが、これは役立つはずです。
<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>