Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it L'avatar di Sonikag
    Registrato dal
    Mar 2004
    Messaggi
    1,943

    Errore modifica query online

    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:

    codice:
    $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

  2. #2
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,076
    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.

  3. #3
    Utente di HTML.it L'avatar di Sonikag
    Registrato dal
    Mar 2004
    Messaggi
    1,943
    Grazie.
    Il codice è questo (Super banale)
    Codice PHP:
    $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.
    Ultima modifica di Sonikag; 26-11-2020 a 13:23

  4. #4
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,076
    Quote Originariamente inviata da Sonikag Visualizza il messaggio
    ...
    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 è
    Codice PHP:
    $result->bind_param(...) 
    e $result è un booleano perché la prepare() ha ritornato false, ha fallito l'esecuzione, difatti inizializzi tale variabile con
    Codice PHP:
    $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
    Codice PHP:
    $result->bind_param('ssi'$marca$tipo$idinverter); 

  5. #5
    Utente di HTML.it L'avatar di Sonikag
    Registrato dal
    Mar 2004
    Messaggi
    1,943
    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.

    codice:
    $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.
    Ultima modifica di Sonikag; 26-11-2020 a 14:01

  6. #6
    Utente di HTML.it L'avatar di Sonikag
    Registrato dal
    Mar 2004
    Messaggi
    1,943
    RISOLTO!!!

    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!

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2021 vBulletin Solutions, Inc. All rights reserved.