PDA

Visualizza la versione completa : Errore modifica query online


Sonikag
26-11-2020, 12:19
Premessa.
Ho sito php+ajax che in locale mi funziona e sul server on line funziona.
Sulla stessa base ho sviluppato un secondo sito che fino a ieri andava sia in locale che sul server (lo stesso della prima applicazione).
Da oggi NESSUNA query di modifica funziona on line! Gli inserimenti funzionano.

I log del server mi danno questi warning:

mod_fcgid: stderr: PHP Fatal error: Uncaught Error: Call to a member function bind_param() on boolean in /var/www/vhosts/ppp.it/httpdocs/ppp/anagrafiche/inverter_modifica_.php:28, referer: http://ppp.it/ppp/anagrafiche/inverter_modifica.php
mod_fcgid: stderr: Stack trace:, referer: http://ppp.it/ppp/anagrafiche/inverter_modifica.php
mod_fcgid: stderr: #0 {main}, referer: http://ppp.it/ppp/anagrafiche/inverter_modifica.php
mod_fcgid: stderr: thrown in /var/www/vhosts/ppp.it/httpdocs/ppp/anagrafiche/inverter_modifica_.php on line 28, referer: http://ppp.it/ppp/anagrafiche/inverter_modifica.php

---

Ho commentato tutto il mio files e scommentato pian piano l'errore appare qui:


$result->bind_param('ssi', $par[0], $par[1], $par[2]);

Ovviamente i dati passati sono corretti.
Dalla console vedo questo errore:
[HTTP/1.1 500 Internal Server Error 139ms]

Grazie a chi ha un idea

Alhazred
26-11-2020, 12:46
Prima di questa istruzione dovresti avere una prepare(), se quella dovesse avere un qualche problema ritornerebbe "false" invece della query e quello è il boolean inatteso che ti ritrovi nella bind.

Devi capire perché la prepare fallisce, controlla che la query sia scritta correttamente, magari ti è scappata qualche virgola, una parentesi, un'apice o altro.

Sonikag
26-11-2020, 12:58
Grazie.
Il codice è questo (Super banale)


$qwt = "UPDATE `inverter` SET `marca` = ?, `tipo` = ? WHERE `idinverter` = ?";

$result = $connessione->prepare($qwt);
$par = array($marca, $tipo, $idinverter);
$result->bind_param('ssi', $par[0], $par[1], $par[2]);


Escludo sia un problema di codice visto che in locale funziona.
Ho commentato tutta la pagina e non c'erano errori. Poi ho scommentato riga per riga e l'ORRORE è la non sulla prepare.

Dalla console ho verificato i dati passati:
marca "Master"
tipo "Master+CS20TL"
idinverter "5"

Una cosa stranissima! Ovviamente il db sono dati varchar max 150 e l'id è numerico e primario.

Alhazred
26-11-2020, 13:20
...
Ho commentato tutta la pagina e non c'erano errori. Poi ho scommentato riga per riga e l'ORRORE è la.
...
L'errore può essere generato su una certa istruzione, la causa però potrebbe essere altrove, ad esempio dove viene inizializzato uno dei parametri che poi usa. Non dare per scontato che il problema sia sull'istruzione che genera il messaggio d'errore.

Il messaggio che hai dice


Call to a member function bind_param() on boolean

Il che vuol dire che hai un booleano e su questo stai provando ad invocare il metodo bind_param().

Il booleano di cui parla è $result, infatti l'istruzione che ti genera l'errore è


$result->bind_param(...)

e $result è un booleano perché la prepare() ha ritornato false, ha fallito l'esecuzione, difatti inizializzi tale variabile con


$result = $connessione->prepare($qwt);

$result prende come valore il risultato di $connessione->prepare($qwt) quindi della prepare()

Devi capire perché la prepare() fallisce, prova a rimuovere i backtick `
Verifica anche che $marca, $tipo e $idinverter siano inizializzate correttamente, i dati dal client hai verificato che vengono inviati correttamente, verifica che vengano anche assegnati correttamente alle variabili php.

P.S. questo è solo un appunto per migliorare l'efficienza, non serve generare l'array $par a meno che tu non abbia un motivo particolare, puoi fare tutto sulla bind


$result->bind_param('ssi', $marca, $tipo, $idinverter);

Sonikag
26-11-2020, 13:46
RI-GRAZIE MILLE.
I dati sono corretti, ho tagliato la testa al toro e invece di prenderli dal post li ho "forzati".
In locale continuano ad andare e on line no!
l'array $par lo genero perchè lo uso per una funzione che mi genera i log. Ti metto il codice integrale.



$marca ='Master';
$tipo = 'CS20TL';
$idinverter = 5;

$qwt = "UPDATE inverter SET marca=?, tipo=? WHERE idinverter=?";

$result = $connessione->prepare($qwt);
$par = array($marca, $tipo, $idinverter);

$result->bind_param('ssi', $par[0], $par[1], $par[2]);
// // usare i invece di s per i numerici

$operazione = SqlDebug($qwt, $par);

function SqlDebug($raw_sql, $params=array())
{
$keys = array();
$values = $params;
foreach ($params as $key => $value)
{
// check if named parameters (':param') or anonymous parameters ('?') are used
if (is_string($key)) { $keys[] = '/:'.$key.'/'; }
else { $keys[] = '/[?]/'; }
// bring parameter into human-readable format
//if (is_string($value)) { $values[$key] = "'" . $value . "'"; }
if (is_array($value)) { $values[$key] = implode(',', $value); }
elseif (is_null($value)) { $values[$key] = 'NULL'; }
}
$raw_sql = preg_replace($keys, $values, $raw_sql, 1, $count);
return $raw_sql;
}


$fp = fopen("../log/inverter.txt", "a");
if(!$fp) die ("Errore nella operaione con il file");
$data2 = date('d')."-".date('m')."-".date('Y'). " " .date('H').":".date('i');
$chi = $_SESSION['nominativo'];
$dispositivo = $_SERVER['HTTP_USER_AGENT'];
fwrite($fp, "\r\n".$data2." - " . $chi ." - ". $operazione. " - " .$dispositivo);
fclose($fp);

$result->execute();


$result->close();
$connessione->close();


Per togliermi il dubbio ho provato pure a caricarlo su un server diverso dove funziona e gira correttamente suo "padre" da cui sono partita a sviluppare. Ovviamente il problema ce l'ho pure li.

Sonikag
26-11-2020, 16:04
RISOLTO!!! :unz:

Ero certa fosse una cavolata che più cavolata non si può... ma era talmente cavolata che non l'avevo vista.
Le select andavano tutte, le insert into andavano tutte, ma 10 update no!
Il caso ha voluto che solo nelle query di modifica le tabelle le avessi chiamate nomedb.nometabella e online ho cambiato il nome del db!

Tra l'altro i test li stavo facendo su una query ridicola che era impossibile sbagliare!
Grazie dell'aiuto!

Loading