Chiamata di funzione PHP dal modulo non funzionante
-
06-07-2019 - |
Domanda
Sto provando a chiamare una funzione da un modulo all'interno dello stesso file .php, ma quando viene premuto il pulsante Invia, la tabella non viene generata.
Ecco il codice:
<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 = ' Sto provando a chiamare una funzione da un modulo all'interno dello stesso file .php, ma quando viene premuto il pulsante Invia, la tabella non viene generata.
Ecco il codice:
<*>
Hai idea del perché questo non funziona?
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>
Hai idea del perché questo non funziona?
Soluzione
Se ti aspetti un numero intero come un anno, prendilo dal superglobal POST come
$year=(int) Se ti aspetti un numero intero come un anno, prendilo dal superglobal POST come
<*>
E aggiungi un parametro alla tua funzione select per prendere l'anno, quindi esegui come suggerito da SanHolo.
A proposito, nota che ho lanciato la variabile in un numero intero (la parte (int)) nell'esempio che ho fornito. Il codice come lo hai è un enorme buco di sicurezza. È necessario cercare la santizzazione dei dati, l'iniezione di SQL e, eventualmente, le istruzioni preparate con parametri (consultare PDO).
Dove hai inserito $ _POST ['year_txt'], qualcuno potrebbe inserire ANYTHING direttamente nella tua istruzione SQL ... Come, " 90; elimina dai filmati dove 1; " ;. Dai un'occhiata all'istruzione SQL che verrebbe creata!
Non mai stampare l'input fornito dall'utente e Certamente non inserirlo in un comando SQL senza prima averne verificato l'integrità e sanificarlo. Se è un numero, esegui il cast in int. Se ricevi una stringa, usa preg_replace per filtrare eventuali caratteri dispari. Puoi anche utilizzare alcune funzioni filter_var di PHP - http://php.net/manual /en/function.filter-var.php
POST['year_txt'];
E aggiungi un parametro alla tua funzione select per prendere l'anno, quindi esegui come suggerito da SanHolo.
A proposito, nota che ho lanciato la variabile in un numero intero (la parte (int)) nell'esempio che ho fornito. Il codice come lo hai è un enorme buco di sicurezza. È necessario cercare la santizzazione dei dati, l'iniezione di SQL e, eventualmente, le istruzioni preparate con parametri (consultare PDO).
Dove hai inserito $ _POST ['year_txt'], qualcuno potrebbe inserire ANYTHING direttamente nella tua istruzione SQL ... Come, " 90; elimina dai filmati dove 1; " ;. Dai un'occhiata all'istruzione SQL che verrebbe creata!
Non mai stampare l'input fornito dall'utente e Certamente non inserirlo in un comando SQL senza prima averne verificato l'integrità e sanificarlo. Se è un numero, esegui il cast in int. Se ricevi una stringa, usa preg_replace per filtrare eventuali caratteri dispari. Puoi anche utilizzare alcune funzioni filter_var di PHP - http://php.net/manual /en/function.filter-var.php
Altri suggerimenti
Non vedo dove si CHIAMA effettivamente la funzione, la definisci solo. Devi implementare un blocco che legge qualcosa del genere:
if (isset(Non vedo dove si CHIAMA effettivamente la funzione, la definisci solo. Devi implementare un blocco che legge qualcosa del genere:
<*>GET['action'])) { if ('selectQuery' ==Non vedo dove si CHIAMA effettivamente la funzione, la definisci solo. Devi implementare un blocco che legge qualcosa del genere:
<*>GET['action']) { selectQuery(); } }
Ok, ecco una versione riscritta. Ovviamente non è ancora l'ideale ma questo dovrebbe aiutare.
<html>
<head><title>Movies, yo</title></head>
<body>
<?php
$year=(int) Ok, ecco una versione riscritta. Ovviamente non è ancora l'ideale ma questo dovrebbe aiutare.
<*>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'== Ok, ecco una versione riscritta. Ovviamente non è ancora l'ideale ma questo dovrebbe aiutare.
<*>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>