[risolto] Istruzione per estrazione di dati casuali dal db

  • Creatore Discussione Creatore Discussione Altutto
  • Data di inizio Data di inizio

Altutto

Utente Attivo
30 Set 2013
262
0
16
stubborn.altervista.org
PHP:
  $ress2 = mysql_query("SHOW COLUMNS FROM matematica", $con2);  
if($ress2 == FALSE) {
    die(mysql_error()); 
}
  while ($row2 = mysql_fetch_array($ress2))  {
    $columns= implode(",", $row2);  
     $current_col=""; // <- contiene il nome colonna corrente  
     for($i=0; $i<strlen($columns); $i++)  
     {  
        if($columns[$i] != ',')  
           $current_col .= $columns[$i];  
        else  
           break;  
     }  
}
$sqla = "SELECT * FROM matematica WHERE  ".$current_col." LIKE '%".$ricerca."%' ORDER BY RAND() LIMIT 1";
$ressa= mysql_query($sqla, $con2);  
if($ressa == FALSE) {
    die(mysql_error());
}
         while ($rowa = mysql_fetch_array($ressa))  
         {
         echo "Spiega la procedura del seguente argomento:";
echo $rowa['argomento'];
          }
Dovrebbe estrarmi e stamparmi a video un record casuale della colonna 'argomento' dalla tabella 'matematica' dove i record sono simili a quelli in $ricerca...
E invece non stampa nulla! :(
Ho provato ad individuare gli errori sia con
PHP:
if($ressa == FALSE) {
    die(mysql_error());
}
che inserendo all'inizio del file
PHP:
error_reporting(E_ALL);
, ma non risultano erroi :mad: :mad: :mad: :confused:
Cosa ho sbagliato, secondo voi?
 
ciao
per prima cosa prova a mettere un var_dump per vedere se la querystringa sia come dovrebbe essere
PHP:
<?php
//....
$sqla = "SELECT * FROM matematica WHERE  ".$current_col." LIKE '%".$ricerca."%' ORDER BY RAND() LIMIT 1";
var_dump($sqla);//poi lo togli o lo commenti
$ressa= mysql_query($sqla, $con2);
//....
?>
dimenticavo dato che hai LIMIT 1 non ti serve il while, ma basta

PHP:
$rowa = mysql_fetch_array($ressa);
 
Ultima modifica:
Codice corretto secondo le indicazioni:
PHP:
  $ress2 = mysql_query("SHOW COLUMNS FROM matematica", $con2);   
if($ress2 == FALSE) { 
    die(mysql_error());  
} 
  while ($row2 = mysql_fetch_array($ress2))  { 
    $columns= implode(",", $row2);   
     $current_col=""; // <- contiene il nome colonna corrente   
     for($i=0; $i<strlen($columns); $i++)   
     {   
        if($columns[$i] != ',')   
           $current_col .= $columns[$i];   
        else   
           break;   
     }   
} 
$sqla = "SELECT * FROM matematica WHERE  ".$current_col." LIKE '%".$ricerca."%' ORDER BY RAND() LIMIT 1"; 
var_dump($sqla);
$ressa= mysql_query($sqla, $con2);   
if($ressa == FALSE) { 
    die(mysql_error()); 
} 
$rowa = mysql_fetch_array($ressa);  
         echo "Spiega la procedura del seguente argomento:"; 
echo $rowa['argomento'];

Risultato: string(87) "SELECT * FROM matematica WHERE capitolo LIKE '%quellochehocercato%' ORDER BY RAND() LIMIT 1" Spiega la procedura del seguente argomento:



Mentre invece dovrebbe essere stampato anche un argomento casuale :(
 
ciao
da quanto ho capito l'errore si annida qui
Risultato: string(87) "SELECT * FROM matematica WHERE capitolo LIKE '%quellochehocercato%'
da dove salta fuori la variabile $ricerca?
questo perche
1) la query stringa è sintatticamente corretta (occhio dico sintatticamente)
2) non hai errori da mysql_query, quindi la query viene eseguita senza problemi
quindi o c'è un errore nella valorizzazione della variabile $ricerca o non esistono record che nel campo (cito quello che hai usato)
capitolo abbiano come valore una stringa che inizi/contienga/finisca quellochehocercato
poi aspetta ti dico di fare una prova
 
ciao
prova a modificare così
PHP:
<?php
//.....
$sqla = "SELECT * FROM matematica WHERE  ".$current_col." LIKE '%".$ricerca."%' ORDER BY RAND() LIMIT 1"; 
//var_dump($sqla);
$ressa= mysql_query($sqla, $con2) or die (mysql_error()) ;   
if(mysql_num_rows($ressa)==0) { 
    echo "nessun record trovato"; 
}else{
	$rowa = mysql_fetch_array($ressa);  
	echo "Spiega la procedura del seguente argomento:"; 
	echo $rowa['argomento']; 
}
//....
?>
se ti da nessun record trovato per qualsiasi ricerca che fai appunto l'errore è in $ricerca o non esistono campi che soddisfino il LIKE
 
Sì, scusa, non ho postato questa parte di codice, che è antecedente al resto:
PHP:
$ricerca=$_GET['ricerca'];
Sono sicuro al 100% che esista nella tabella "matematica" 3 record che contengono quellochehocercato

Mi dice effettivamente "nessun record trovato", eppure ho cercato "test" e nella tabella questa parola è presente in tre diversi record D:
 
ciao
nei record della tabella ok, ma deve essere nel campo su cui effettui la ricerca, cioè prima ho notato che hai usato un campo chiamato capitolo, sei sicuro che ci sia qualche record che nel campo capitolo abbia quellochehocercato?
 
ciao
ho fatto prima
ho provato questo semplice script adattandolo ad una tabella che ho (quindi a parte i nomi tabella e campi è uguale)
PHP:
<?php
$host = 'localhost';     //nome host
$username = 'root';      //user name
$password = 'password';  //password
$db = 'borgo-italia';  // nome data base
//---connessione----------------------------------------------------
$conn = mysql_connect($host,$username,$password) or die (mysql_error());
$sel = mysql_select_db($db) or die (mysql_error());
$ricerca="Emilia";
$sqla = "SELECT * FROM gli_speciali WHERE  regione LIKE '%".$ricerca."%' ORDER BY RAND() LIMIT 1";
$ris=mysql_query($sqla);
if(mysql_num_rows($ris)==0){
	echo "<br>nessuno<br>";
}else{
	$riga=mysql_fetch_array($ris);
	echo "<br>trovato id: ".$riga['id']." regione: ".$riga['regione']." file: ".$riga['file']."<br>";
}
?>
su 118 record diversi ho questi 5
Codice:
1 	1294472414 	lagoSanto_parmense.php 	Emilia 	
4 	1300185591 	abbaziapomposa.php 	Emilia 	
80 	1299683008 	dozza.php 		Emilia 	
81	1291489626 	priorato-fontanellato.php 	Emilia 
85 	1311098615 	castelli_ducato.php 	Emilia

ora lanciando lo script me ne tira fuori uno a caso e dando l'aggiorna sempre un'altro a caso
quindi lo script funziona per cui l'errore non è nella query, tra l'altro il LIKE è caseinsensitive (per me è lo stesso scrivere emil o Emil)
comunque provato con ricerca (variando anche le maiscole/minuscole)
=Emilia
=emil
=ilia
=mili
sempre con lo stesso risultato ok es.
trovato id: 4 regione: Emilia file: lagoSanto_parmense.php
quindi è probabile che tu stia sbagliando qualcosa nell'indicargli dove deve cercare o ti porti dietro in $ricerca qualche carattere strano
 
Grazie per l'aiuto :D
Ti dico i record che ho attualmente e che contengono "test".

pagina/argomento/argomento_madre/procedura/definizione/attenzione/prima/seconda/terza/ anno_scolastico/capitolo

522/test/test/test/test/test/test/test/test/2013-2014/12

443/questo è un test/questo è un test/questo è un test/questo è un test/questo è un test/questo è un test/questo è un test/questo è un test/2013-2014/12

Cerco tramite il metodo GET "test" e mi viene fuori "nessun record trovato" :(
 
Ciao, il campo capitolo quindi contiene il numero 12 non la parola test
 
Ora sì, prima conteneva "test" anche lui, poi però ho consentito solo valori numerici nella colonna "capitolo" (l'ho impostato su tinyint, prima era varchar) e ho dovuto cambiare il valore
 
ciao
prova direttamente su phpmyadmin
Codice:
SELECT * FROM matematica WHERE  argomento_madre LIKE '%test%' ORDER BY RAND() LIMIT 1
e guarda cosa ti risulta
 
ciao
visto che su phpmyadmin funzia, la querysrtinga è sintatticamente corrette, mysql non ti da errori ,unica cosa (rimetti il var_dump) è che una delle due variabili che impazzisca o non sia correttamente utilizzata

$sqla = "SELECT * FROM matematica WHERE ".$current_col." LIKE '%".$ricerca."%' ORDER BY RAND() LIMIT 1";

verifica per il valore di $current_col nel suo campo tu abbia almeno un record che soddisfi il like con $ricerca.
cioe dato gli esempi che hai postato verifica che se $ricerca è test la variabile $current_col contenga il nome di un campo con valore test
perchè (sempre da quello che hai postato) se $current_col contiene "capitolo" e $ricerca "test" il risultato sara sempre non trovato in quanto "capitolo" contiene 12
 
$current_col dovrebbe equivalere a
PHP:
pagina LIKE '%".$ricerca."%' or  argomento LIKE '%".$ricerca."%' or  argomento_madre LIKE '%".$ricerca."%' or   procedura LIKE '%".$ricerca."%' or definizione  LIKE '%".$ricerca."%' or attenzione LIKE '%".$ricerca."%' or prima LIKE '%".$ricerca."%' or seconda LIKE '%".$ricerca."%' or terza LIKE '%".$ricerca."%' or anno_scolastico LIKE '%".$ricerca."%' or capitolo LIKE '%".$ricerca."%'
(almeno, l'idea era quella XD), evidentemente non è così...
Il codice per ottenere $current_col è
PHP:
  while ($row2 = mysql_fetch_array($ress2))  { 
    $columns= implode(",", $row2);   
     $current_col=""; // <- contiene il nome colonna corrente   
     for($i=0; $i<strlen($columns); $i++)   
     {   
        if($columns[$i] != ',')   
           $current_col .= $columns[$i];   
        else   
           break;   
     }   
}
è corretto?
 
il mio intervento si riferiva a questa tua risposta
Risultato: string(87) "SELECT * FROM matematica WHERE capitolo LIKE '%quellochehocercato%' ORDER BY RAND() LIMIT 1" Spiega la procedura del seguente argomento:
come vedi nel var_dump che ti ha fatto mettere Borgo il nome del campo è "capitolo" che contiene un numero e non del testo, cosi la query non ti restituirà mai un risultato
il problema quindi dovrebbe essere nella variabile $current_col
 
ciao
come ha detto anche crirc probabilmente l'errore è in $current_col, quindi mette il solito var_dump
PHP:
<?php
//....
 while ($row2 = mysql_fetch_array($ress2))  { 
    $columns= implode(",", $row2);   
     $current_col=""; // <- contiene il nome colonna corrente   
     for($i=0; $i<strlen($columns); $i++)   
     {   
        if($columns[$i] != ',')   
           $current_col .= $columns[$i];   
        else   
           break;   
     }   
}
var_dump($current_col);//punto da verificare
//.....
?>
da quanto hai detto la tua tabella ha i seguenti campi
Codice:
pagina|argomento|argomento_madre|procedura|definizione|attenzione|prima|seconda|terza| anno_scolastico|capitolo
e questo è l'esempio del loro contenuto in due record
Codice:
522|test|test|test|test|test|test|test|test|2013-2014|12
443|questo è un test|questo è un test|questo è un test|questo è un test|questo è un test|questo è un test|questo è un test|questo è un test|2013-2014|12

allara se facendo le possibili prove il var_dump ti restituisce o
string (xy) e un tra questi argomento|argomento_madre|procedura|definizione|attenzione|prima|seconda|terza
ma se ti restituisce
string (xy) e uno di questi pagina|anno_scolastico|capitolo
c'è qualcosa che non va nello script per rilevare il nome del campo che ti serve (a parte che non capisco esattamente quello che vuoi fare)
 

Discussioni simili