سؤال

وأنا أحاول أن استدعاء دالة من شكل ضمن نفس الملف. فب، ولكن عندما زر إرسال يتم ضرب، لا يحصل إنشاء الجدول.

وهنا رمز:

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

وأي فكرة لماذا هذا لا يعمل؟

هل كانت مفيدة؟

المحلول

إذا كنت تتوقع عددا صحيحا كسنة، والحصول عليها من superglobal POST كما

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

وإضافة معلمة إلى وظيفة محددة لاتخاذ هذا العام، ثم تنفيذ كيف مثل SanHolo المقترحة.

وراجع للشغل، لاحظ I يلقي المتغير إلى عدد صحيح (كثافة العمليات) جزء () في المثال الأول المقدمة. رمز لديك هو ثغرة أمنية ضخمة. تحتاج للبحث عن santization البيانات، حقن SQL، والبيانات المعدة ربما معلمات (راجع PDO).

وأين كنت وضعت في $ _POST [ 'year_txt']، شخص يمكن وضع أي شيء على التوالي في بيان SQL الخاصة بك ... مثل، "90؛ حذف من الأفلام حيث 1؛". تحقق من عبارة SQL التي من شأنها خلق!

لا <م> من أي وقت مضى طباعة المستخدم توفير المدخلات وبالتأكيد لا وضعه في أمر SQL دون التحقق أولا لأنها التعقل والتعقيم ذلك. اذا كان عدد، ويلقي على كثافة العمليات. إذا كنت تتلقى سلسلة، استخدم preg_replace لتصفية أية أحرف غريبة. يمكنك أيضا استخدام بعض الوظائف filter_var PHP - 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>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top