2012-12-07 13 views
5

Sono un principiante di PHP e ultimamente ho avuto un problema con il mio codice sorgente.Problema dell'istruzione Foreach PHP. Più righe vengono restituite

Eccolo:

<html> 
    <head> 
     <title> 
      Bot 
     </title> 
     <link type="text/css" rel="stylesheet" href="main.css" /> 
    </head> 
    <body> 
     <form action="bot.php "method="post"> 
      <lable>You:<input type="text" name="intrebare"></lable> 
      <input type="submit" name="introdu" value="Send"> 
     </form> 
    </body> 
</html> 
<?php 
//error_reporting(E_ALL & ~E_NOTICE); 
mysql_connect("localhost", "root", "") or die(mysql_error()); 
mysql_select_db("robo") or die(mysql_error()); 

$intrebare=$_POST['intrebare']; 
$query = "SELECT * FROM dialog where intrebare like '%$intrebare%'"; 
$result = mysql_query($query) or die(mysql_error()); 
$row = mysql_fetch_array($result) or die(mysql_error()); 
?> 
<div id="history"> 
<?php  
     foreach($row as $rows){ 
      echo "<b>The robot says: </b><br />"; 
      echo $row['raspuns']; 
      } 
?> 
</div> 

Riporta il risultato 6x volte.

Questo problema si è verificato quando ho effettuato il comando foreach perché volevo che i risultati rimanessero nella pagina uno dopo l'altro dopo ogni query SQL.

Potete dirmi per favore quale potrebbe essere il problema? Grazie!

risposta

4

Stai facendo male. ;-)

Prima di tutto bisogna prendere il vostro risultato con mysql_fetch_array in un ciclo come questo:

while (true == ($row = mysql_fetch_array($result))) { 
    echo "<b>The robot says: </b><br />"; 
    echo $row['raspuns']; 
} 

In secondo luogo voglio dirvi che tutte le funzioni mysql_ * sono contrassegnati come deprecato. Se vuoi imparare PHP dovresti cercare di imparare come connetterti a mysql usando PDO.

+3

Ho provato il tuo codice e ha funzionato, grazie. Ma mi restituisce comunque il risultato e poi lo sostituisce con quello successivo. Voglio mantenere tutti i risultati sulla pagina. Puoi dirmi per favore come posso farlo? –

3

Si sta tentando è invertito modo:

<?php  

    while($row = mysql_fetch_array($result,MYSQL_ASSOC)){ 
     echo '<strong>The robot says: </strong><br />', $row['raspuns']; 
     } 
    ?> 

Prova ora :)

+1

Lasciatemi riformulare il ciclo foreach in inglese semplice. Per ciascuna delle $ row da $ rows .... echo a $ row. Aiuta? – Lenin

+0

@Downvoter hai validi motivi per downvotare? – Lenin

+2

Io ero il downvoter; 'mysql_fetch_array ($ result)' recupera solo una riga alla volta. Pertanto, con una sola chiamata, il ciclo foreach sta solo iterando attraverso la prima riga. –

3

Usa, mentre per recuperare tutti i dati e verificare i nomi delle variabili

 while($row = mysql_fetch_array($result)){ 
     echo "<b>The robot says: </b><br />"; 
     echo $row['raspuns']; // Here 
     } 
+0

questo non risolverà il suo problema perché $ row non è un array –

+0

@BenjaminPaap - $ row È un array; era appena stato impostato una sola volta –

+1

@MTahir - Conta le parentesi –

4

mysql_fetch_array recupera una riga per ogni chiamata . Avrai voglia di fare in questo modo:

while ($row = mysql_fetch_array($result)) { 
    echo "<b>The robot says:</b><br>"; 
    echo htmlentities($row['raspuns']); 
} 

e di sbarazzarsi di quel primo mysql_fetch_array.

(Si noti che sto HTML-sfuggire alla uscita variabile. A meno che non si sa cosa si sta facendo, non si dovrebbe dati grezzi in uscita in una pagina.)

A proposito, mysql_query è effettivamente deprecato. Non è consigliato per il nuovo codice. Dai un'occhiata a mysqli (la sostituzione) o DOP (la nuova hotness). Con la nuova interfaccia mysqli (objecty), la parte PHP apparirebbe un po 'come questo:

<?php 

//error_reporting(E_ALL & ~E_NOTICE); 

$db = new mysqli('localhost', 'root', '', 'robo'); 

# turn into a wildcard 
$intrebare='%' . $_POST['intrebare'] . '%'; 

$stmt = $db->prepare('SELECT * FROM dialog WHERE intrebare LIKE ?'); 
$stmt->bind_param('s', $intrebare); 
$result = $stmt->execute(); 

echo '<div id="history">'; 
# 5.4 lets you do it like this; 
# older versions, try `while ($row = $result->fetch_assoc())` 
foreach ($result as $row) { 
    echo "<b>The robot says: </b><br />"; 
    echo htmlentities($row['raspuns']); 
} 

?> 
3

Si ottiene solo un risultato (una sola chiamata a mysql_fetch_array()). Ci sono sei colonne, scommetto, nel dialogo.

... 
$result = mysql_query($query) or die(mysql_error()); 
?> 
<div id="history"> 
<?php 
while($row = mysql_fetch_array($result)) 
{ 
    echo "<b>The robot says: </b><br />"; 
    echo htmlentities($row['raspuns']); 
} 
?> 
</div> 

Inoltre, le funzioni di mysql_ * sono deprecate. Passare a mysqli_ * o PDO.

Problemi correlati