Fatal error: Call to a member function prepare() on null in

di il
3 risposte

Fatal error: Call to a member function prepare() on null in

Salve ragazzi
Spero di postare nel luogo giusto e di seguire tutte le procedure descritte per postare un nuovo post.
Nel caso di errore chiedo scusa anticipatamente e rifarò nuovamente tutto.

Allora io e un mio amico stiamo lavorando su un progetto ma ci siamo bloccati da qualche giorno su un errore, non siamo degli esperti di php quindi spero di non dire troppe sciocchezze.

Veniamo al dunque, a noi risulta questo errore :

Fatal error: Call to a member function prepare() on null in /membri/progettoditelematica2019/index.php on line 18

il codice a cui si fa riferimento è questo

<?php

include 'connessione.php';
//require_once 'sessioni.php';//include una volta sola il metodo sessioni
session_start();
if (isset($_SESSION["nickname"])){ //se risulta già un cookie loggato, entra
    header("location: visualizzafatture.php");


    exit;
}

if (isset($_POST["submitx"])){ //se è stato premuto il pulsante submitx, manda la query al db
    $nickname = $_POST['nickname'];
    $password = $_POST['password'];

  //  $query = $mysqli->query("SELECT * FROM Utenti WHERE Nickname = '$nickname' AND Password = '$password'");
  //  $query2 = $mysqli->query("SELECT * FROM Fornitore WHERE Nickname = '$nickname' AND Password = '$password'");

    $query = $mysqli->prepare("SELECT * FROM Utenti WHERE Nickname = ? AND Password = ?");
    $query2 = $mysqli->prepare("SELECT * FROM Fornitore WHERE Nickname = ? AND Password = ?");

  
    $query->bind_param('ss',$nickname,$password);
    $query2->bind_param('ss',$nickname,$password);
  
    $query->execute();
  
    //ho deciso di mettere in sicurezza l'accesso al sito utilizzato i prepared statements
    //senza, l'accesso al sito poteva essere messo a rischio semplicemente manomettendo la query
    //ed inserendo ' or ''=' nello username e password.
  
    if($query->fetch()) {//query->num_rows
        echo "Accesso consentito";
        $_SESSION["nickname"] = $nickname;
        $_SESSION["fornitore"] = false;
        header("location: visualizzafatture.php");
        exit();
    }
    else{
        $query->close();
        $query2->execute();
        echo "Accesso rifiutato";
    }
  
    if($query2->fetch()){//query2->num_rows
        echo "Accesso consentito";
        $_SESSION["nickname"] = $nickname;
        $_SESSION["fornitore"] = true;
      
        header("location: visualizzafatture.php");
        exit();
    }
  
    else {
        echo "Accesso rifiutato";
    }
  
}

$art='
__________                   .___             __       _____                   __
\______   \_______  ____   __| _/_ __   _____/  |_    /     \ _____    _______/  |_  ___________
 |     ___/\_  __ \/  _ \ / __ |  |  \_/ ___\   __\  /  \ /  \\\\__  \  /  ___/\   __\/ __ \_  __ \
 |    |     |  | \(  <_> ) /_/ |  |  /\  \___|  |   /    Y    \/ __ \_\___ \  |  | \  ___/|  | \/
 |____|     |__|   \____/\____ |____/  \___  >__|   \____|__  (____  /____  > |__|  \___  >__|
                              \/           \/               \/     \/     \/            \/
';

?>

<html>
    <body>
            <center><h1>Benvenuto in</h1></center>
            <center>
            <table>
            <tr><td>
            <pre style="font-family: 'Courier New', Courier, monospace"><?php echo $art; ?></pre>
            </tr></td>
            </table>
            <h4>Entra in Product Master per trovare con noi le offerte migliori</h4>

            </center>    
                                                                                                                                            </p></center>
            <br>
            <form action="index.php" method="POST">
              
                  <center>
                      <table>
                          <tr><td>Username:</td><td><input type="text" name="nickname"></td></tr>
                          <tr><td></td><td></td></tr>                        
                          <tr><td>Password:</td><td><input type="password" name="password"></td></tr>
                      </table>
                  </center>
                
                    <center><input type="submit" name="submitx" id="submit" value="login"></center>
                  
            </form>
          
    </body>
</html>

vi metto anche il codice di connessione.php


<?php
$mysqli = new mysqli('localhost','root', '123qwe', "Product_Master");

if ($mysqli->connect_error) { //connetto al database
    die('Errore di connessione (' . $mysqli->connect_errno . ') ' . $mysqli->connect_error);
    exit();
}
else {
    //echo '<center><p>' . 'Connesso. ' . $mysqli->host_info . '</p></center>';
}

class gestioneprodotti
{
}

il sito su cui noi stiamo lavorando è questo se volete vedere voi di persona

http://progettoditelematica2019.altervista.org/index.php

Cosa significa quell'errore li? ci siamo impantanati mannaggia !!

3 Risposte

  • Re: Fatal error: Call to a member function prepare() on null in

    Ciao,

    sembra che la variabile $mysqli non sia inizializzata, infatti l'errore dice che stai tentando di chiamare il metodo di una classe su una variabile di tipo NULL, ovvero non inizializzata.

    Detto questo il codice è un pò confuso, come mai i dati di login (username e pwd) sono salvati in due tabelle diverse (Utenti e Fornitore)? E la logica dietro tutti quegli if?

    Se ti serve sapere se un utente è fornitore, nella tabella Utenti potresti aggiungere un campo "fornitore" di tipo TINYINT, i cui lavori possono essere 1 (fornitore) o 0 (non fornitore). Sempre se ho capito bene lo scopo del tuo script.

    Poi sembra che tu stia salvando le password in chiaro nel DB. Anche se stai smanettando a scopo didattico, ti consiglio di salvare l'hash delle password, e non la password stessa, tramite la funzione password_hash(). Ti lascio il link ad una risorsa che ho scritto sull'argomento. Come memorizzare le password PHP.

    Altra cosa, puoi rendere lo script più robusto facendo un controllo sull'input utente durante la fase di login. Controlla tramite la funzione isset() se le variabili $_POST sono inizializzate
    
    <?php
    
    if (isset($_POST['nickname'], $_POST['password'])) {
        // Continua
    } else {
        // Errore
    }
    
    Altra cosa ancora: la funzione session_start() dovrebbe essere sempre la prima istruzione, perché per impostare un cookie nel pc dell'utente, invia un header al browser e, se prima viene stampato anche un solo echo, otterresti l'avviso
    Warning: session_start(): Cannot start session when headers already sent in
  • Re: Fatal error: Call to a member function prepare() on null in

    flaviors200 ha scritto:


    Ciao,

    sembra che la variabile $mysqli non sia inizializzata, infatti l'errore dice che stai tentando di chiamare il metodo di una classe su una variabile di tipo NULL, ovvero non inizializzata.

    Detto questo il codice è un pò confuso, come mai i dati di login (username e pwd) sono salvati in due tabelle diverse (Utenti e Fornitore)? E la logica dietro tutti quegli if?

    Se ti serve sapere se un utente è fornitore, nella tabella Utenti potresti aggiungere un campo "fornitore" di tipo TINYINT, i cui lavori possono essere 1 (fornitore) o 0 (non fornitore). Sempre se ho capito bene lo scopo del tuo script.
    ok ti ringrazio per le risposte chiare, provo a fare un passettino per volta.
    Intanto ti spiego cosa fa il progetto

    _______________________________________________________
    Il progetto tende a simulare un portale di vendite online.
    Nonostante il login unico, vi sono tre differenti categorie di utenti:
    • L’amministratore (root).
    • L’utente comune.
    • Il fornitore.
    A seconda della tipologia di appartenenza, il sito reindirizzerà alle aree diversamente.
    Per visitare correttamente tutte le pagine, è necessario effettuare l’accesso con almeno un
    utente per ogni categoria.
    L’utente root:
    • Può visualizzare le fatture di vendita e di acquisto a seconda della categoria e dell’arco
    temporale indicato.
    • Può visualizzare, modificare ed eliminare gli utenti e fornitori.
    • Può visualizzare, aggiungere, modificare ed eliminare i prodotti.
    Gli utenti comuni:
    • Possono visualizzare i prodotti disponibili, aggiungerli nel proprio carrello, per poi procedere
    all’acquisto.
    • Possono modificare le proprie informazioni di base.
    • Agli utenti comuni non è permesso né l’accesso all’area riservata ai fornitori, né l’accesso
    all’area di amministrazione
    I fornitori possono:
    • Caricare le proprie fatture di vendita.
    • Rifornire le scorte in magazzino del prodotto indicato.
    • Ai fornitori non è permesso né l’accesso all’area riservata agli utenti comuni, né l’accesso
    all’area di amministratore.
    ______________________________________________________________________

    Il mio problema era prima di tutto farlo partire, poi migliorarlo, so che lo stesso codice partiva ad un mio amico anni fa su un altro sito. Ma ora non più e non capisco appunto il motivo.
    Ho controllato questa mattina e questa qui è la versione PHP 5.6.40 , ( non dovrebbe far problemi )
    Poi volevo chiederti anche se è una domanda banale, in tanti mi dite che non è inizializzata quella variabile $mysqli , però non capisco come inizializzarla correttamente sto provando e riprovando.
  • Re: Fatal error: Call to a member function prepare() on null in

    Ciao,

    anche se hai 3 diversi livelli di accesso (admin, user e furnisher), il mio consiglio è di tenere una sola tabella coi dati di login e del ruolo utente.

    Tabella login
    • id
    • username
    • pwd
    • role
    dove role è una stringa o, se preferisci un intero (0, 1, 2), che assegna il ruolo e di conseguenza eventuali permessi, agli utenti loggati.

    Tabella utenti
Devi accedere o registrarti per scrivere nel forum
3 risposte