Formdan PHP işlevi çağrısı çalışmıyor

3 Cevap php

Beyler, ben aynı. Php dosyası içinde bir formdan bir işlevi çağırmak çalışıyorum, ancak Gönder düğmesini vurduğunuzda, tablo oluşturulan almaz.

İşte kod:

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

Neden bu herhangi bir fikir çalışmıyor?

Şimdiden teşekkürler, ekipsiniz!

3 Cevap

Bir yıl gibi bir tamsayı bekliyorsanız, POST süper küreseli olarak onu almak

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

Ve sonra SanHolo önerdi ne gibi yürütmek, yıl almak için seçme işlevine bir parametre ekleyin.

BTW, ben sağlanan örnek bir tamsayı ((int) bölümü) değişkeni artığını unutmayın. Eğer buna sahip gibi kod çok büyük bir güvenlik açığı olduğunu. Veri santization, SQL enjeksiyon, ve muhtemelen parametreli hazırlanmış deyimleri (PDO check out) bakmak gerekir.

Eğer $ _POST ['year_txt'] koymak yerlerde, birisi gibi ... düz SQL deyimi içine "90; filmleri 1 silmek;" ŞEY koyabilirsiniz. Yaratacak SQL deyimini göz atın!

ever kullanıcı girdileri ile dışarı baskı yapmayın ve kesinlikle ilk aklı için kontrol ve sanitasyon olmadan bir SQL komutu içine koymayın. Bir sayı ise, int döküm. Bir dize alıyorsanız, herhangi bir tek karakter filtrelemek için preg_replace kullanın. Ayrıca belirli bir PHP filter_var işlevlerini kullanabilirsiniz - http://php.net/manual/en/function.filter-var.php

Aslında işlevini ÇAĞRI nerede görmüyorum, sadece bunu tanımlamak. Böyle bir şey okuyan bir blok uygulamak gerekir:

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

Tamam, burada bir yeniden yazılmış versiyonu. Tabii ki yine ideal değil ama bu yardımcı olmalıdır.

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