Problema con mysqli_num_rows

  • Creatore Discussione Creatore Discussione solari77
  • Data di inizio Data di inizio

solari77

Utente Attivo
6 Ott 2016
119
1
18
Ciao a tutti.
Ho un problema con la funzione mysqli_num_rows

Codice:
$sql = "INSERT INTO tabella1 ( campo1 , campo2 , campo3 , campo4 ) values ( 'valore1' , 'valore2' , 'valore3' , 'valore4')";

$result = $mysqli->query($sql);

$num_rows = mysqli_num_rows($result);

var_dump($num_rows);

il risultato è sempre NULL nonostante la query scriva regolarmente sul database.
Dov'è che sbaglio ?
 
il risultato è sempre NULL nonostante la query scriva regolarmente sul database.
Dov'è che sbaglio ?

mysqli_num_rows ti restituisce il numero di righe lette, se scrivi....

es.
PHP:
$sql = "SELECT * FROM tabella1";

$result = $mysqli->query($sql);

$num_rows = mysqli_num_rows($result); // oppure
                                      //$num_rows = $result->num_rows;

var_dump($num_rows);
 
Ciao, grazie per la cortese risposta.
Quindi mysqli_num_rows lo posso utilizzare solo con la SELECT e non con INSERT ?
 
Grazie, come posso fare allora per sapere se
Codice:
$sql = "INSERT INTO tabella1 ( campo1 , campo2 , campo3 , campo4 ) values ( 'valore1' , 'valore2' , 'valore3' , 'valore4')";

$result = $mysqli->query($sql);

$result ha restituito una valore o se la insert non è andata a buon fine?
Quale istruzione posso usare?
 
Grazie per la risposta.
Io se $result restituisce un valore, devo eseguire una determinata operazione.
Come posso inserirla nell'istruzione che mi hai dato?
Mi spiego meglio. Prima avevo
Codice:
$result = $mysqli->query($sql);

$num_rows = mysqli_num_rows($result)
if( $num_rows >0 )
{fai questo}
e questa espressione non funzionava.
Ora con il codice che mi hai fornito, come diventerebbe?
Grazie
 
PHP:
if ($mysqli->query($sql) === TRUE) {
    echo "query correttamente eseguita";
} else {
    echo "Error: " . $sql . "<br>" . $mysqli->error;
}

oppure con affect_rows o mysqli_stmt_affect_rows come consigliato da marino51 fecendo attenzione sulla query di INSERT e UPDATE.
 
PHP:
if ($mysqli->query($sql) === TRUE) {
    echo "query correttamente eseguita";
} else {
    echo "Error: " . $sql . "<br>" . $mysqli->error;
}

Ciao ho provato questa soluzione ma funziona solo in parte
Codice:
$sql1 = "INSERT INTO tabella1 ( ………. )values (…………..)";
$result1 = $mysqli->query( $sql1 );
if ( $result1 === TRUE )
{
$sql2= " UPDATE tabella2 SET ………… ";
$result2 = $mysqli->query( $sql2);
if ( $result2 === TRUE )    {questa istruzione viene eseguita ogni volta che risulta vera la condizione $result1}
}

La prima condizione funziona , mentre la seconda viene eseguita sempre,anche se direttamente da phpMyAdmin, la stessa update da il risultato "0 righe modificate. (La query ha impiegato 0.0012 secondi.) ".
L'unica differenza è che la prima è una INSERT mentre la seconda è una UPDATE
 
Ultima modifica:
$result2 = $mysqli->query( $sql2); if ( $result2 === TRUE )
No viene eseguita se $result1 e $result2 sono vere!

Returns FALSE on failure. For successful SELECT, SHOW, DESCRIBE or EXPLAIN queries mysqli_query() will return a mysqli_result object. For other successful queries mysqli_query() will return TRUE.
 
Cortesemente traduci questo: Returns FALSE on failure. For successful SELECT, SHOW, DESCRIBE or EXPLAIN queries mysqli_query() will return a mysqli_result object. For other successful queries mysqli_query() will return TRUE.
se non è una select (insert/update ...) torna VERO, di conseguenza:
No viene eseguita se $result1 e $result2 sono vere!

Io però ho scritto quello che succede a me e che non risponde alla teoria
Non so che studi hai fatto, posso però garantire che NON è assolutamente come dici... LEGGI (cosa che non si usa più fare) la documentazione prima di utilizzare i metodi.
-----------------------------------------
Stai utilizzando un set di istruzioni, il che per ovvi motivi DEVONO comportarsi come in TEORIA (non avrebbe senso studiare), se qualcosa non funziona sicuramente il flusso logico è errato (come la maggior parte degli errori).

Butta giù due righe, un diagramma di flusso, uno linguaggio naturale, un UML, un caso d'uso, poi ne riparliamo...
 
Cortesemente traduci questo: Returns FALSE on failure. For successful SELECT, SHOW, DESCRIBE or EXPLAIN queries mysqli_query() will return a mysqli_result object. For other successful queries mysqli_query() will return TRUE.
se non è una select (insert/update ...) torna VERO, di conseguenza:



Non so che studi hai fatto, posso però garantire che NON è assolutamente come dici... LEGGI (cosa che non si usa più fare) la documentazione prima di utilizzare i metodi.
-----------------------------------------
Stai utilizzando un set di istruzioni, il che per ovvi motivi DEVONO comportarsi come in TEORIA (non avrebbe senso studiare), se qualcosa non funziona sicuramente il flusso logico è errato (come la maggior parte degli errori).

Butta giù due righe, un diagramma di flusso, uno linguaggio naturale, un UML, un caso d'uso, poi ne riparliamo...

Io ho semplicemente provato ad utilizzare un metodo che mi è stato suggerito in questo post.
Non ho fatto studi informatici, per questo che chiedo aiuto. Altrimenti non avrei scritto qui.
Codice:
$sql1 = "INSERT INTO tabella1 ( ………. )values (…………..)";
$result1 = $mysqli->query( $sql1 );
if ( $result1 === TRUE )
{
$sql2= " UPDATE tabella2 SET ………… ";
$result2 = $mysqli->query( $sql2);
if ( $result2 === TRUE )    {questa istruzione viene eseguita ogni volta che risulta vera la condizione $result1}
}
questo è il mio codice.Chiaramente è sbagliato. Stò chiedendo aiuto per risolverlo.

Se la INSERT restituisce almeno una riga allora devo passare all' UPDATE,Se anche questa restituisce almeno una riga devo eseguire un'altra istruzione.
Io ho scritto prima tutto ciò.Non ho capito se c'è qualcosa che non è chiaro
 
Quale parte non è chiara di questo:
Returns FALSE on failure. For successful SELECT, SHOW, DESCRIBE or EXPLAIN queries mysqli_query() will return a mysqli_result object. For other successful queries mysqli_query() will return TRUE.

insert=>true,
update=>true,

delete=>true


Capisco.... Hai pensato ad effettuare la prima una select e solo dopo controlli ?

PHP:
public function find_actions($data){
     $res=$this->db->where('id',$data['id'])->toArray();
     (empty($res))?$this->elab($data):$this->elab($data,'update');
}

private function elab($data,$type='insert'){
     switch($type){
               case 'update':
                          $this->db->update(TABELLA,$data,['id'=>$data['id']]);
                    break;
               default: $this->db->insert(TABELLA,$data);
      }
}
 
Capisco.... Hai pensato ad effettuare la prima una select e solo dopo controlli ?


No, prima faccio una INSERT su una tabella. Poi ,solo se questa va a buon fine faccio su'un altra tabella un UPDATE.

Però vedo che tu stesso mi hai proposto 2 soluzioni diverse.
PHP:
try{
$result = $mysqli->query($sql);

}catch(exception $e){
dd($e);
}
Ti avevo chiesto di aiutarmi ad inserire la tua soluzione nel mio codice ma non mi hai risposto. Ora mi proponi un'altra soluzione.
Sono sincero, ho difficoltà a seguirti. Sicuramente è colpa mia, però non capisco.
 
.... Il primo suggerimento si riferiva a questa richiesta
$result ha restituito una valore o se la insert non è andata a buon fine?
Quale istruzione posso usare?
Il secondo ad una più ampia ....


No, prima faccio una INSERT su una tabella. Poi ,solo se questa va a buon fine faccio su'un altra tabella un UPDATE.
?????
Se la necessità è quella sopra hai fatto bene a fare come hai fatto!
 
@solari77

una query ti restituisce TRUE quando viene correttamente eseguita.
Un UPDATE che ha effetto su zero riga non è una condizione di errore, è una query che è stata eseguita senza modificare nulla.

Se ti serve conoscere il numero di righe in cui son stati modificati(aggiornati) valori utilizza affect_rows, come gia infdicato, oppure info (mysqli->info) che ti restituisce l'esito di ogni operazione.

PHP:
$sql2= " UPDATE tabella2 SET ………… ";
$result2 = $mysqli->query( $sql2);
if ($mysqli->affected_rows > 0) echo $mysqli->affected_rows;


PHP:
$sql2= " UPDATE tabella2 SET ………… ";
$result2 = $mysqli->query( $sql2);
printf("%s\n", $mysqli->info);
 
@solari77

una query ti restituisce TRUE quando viene correttamente eseguita.
Un UPDATE che ha effetto su zero riga non è una condizione di errore, è una query che è stata eseguita senza modificare nulla.

Se ti serve conoscere il numero di righe in cui son stati modificati(aggiornati) valori utilizza affect_rows, come gia infdicato, oppure info (mysqli->info) che ti restituisce l'esito di ogni operazione.

PHP:
$sql2= " UPDATE tabella2 SET ………… ";
$result2 = $mysqli->query( $sql2);
if ($mysqli->affected_rows > 0) echo $mysqli->affected_rows;


PHP:
$sql2= " UPDATE tabella2 SET ………… ";
$result2 = $mysqli->query( $sql2);
printf("%s\n", $mysqli->info);

Ho provato questa soluzione e sembra funzionare.
Chiedo scusa a @marino51 perchè mi aveva dato la soluzione ma avevo preso un'altra strada.
Faccio ulteriori test e aggiorno.
Grazie
 

Discussioni simili