Visualizzazione risultati 1 fino 4 di 4

Discussione: SQLSTATE 42502: Base Table or view not found

  1. #1
    Data registrazione
    09-12-2022
    Messaggi
    4

    Question SQLSTATE 42502: Base Table or view not found

    Non so se riuscirò a spiegare correttamente, ma quello che vorrei mostrare a tutti è questo:
    1) ho una tabella 'anagrafe', si badi bene anagrafe con la 'a' iniziale minuscola;
    2) ho un controller che ha questi due compiti: se l'utente che sta operando ha lo status di amministratore, prima seleziona tutti i record di anagrafe, poi apre una view dove li mette in elenco con accanto ad ogni record un bottone che ne consente la visione di dettaglio (ossia con tutti i campi anche quelli non mostrati nella tabella),
    se l'utente ha lo status di 'Guest', allora l'elenco viene limitato ai soli record che possiedono uno stesso codice che ha l'utente.
    pubblico il codice:

    Codice PHP:
    public function showIndex(int $pag=1,string $by='FullName')
    {
    if (!empty(
    $_SESSION['message'])){
    ....
    }else{
    ....
    }
    $result=$this->........();
    if(!
    $result['success']){
    ....
    redirect('/denied');
    }

    $this->pagination->setPage($pag);
    ....

    if(
    $this->userVM->userRoles->ClaimValue=='Guest')
    {
    $result=$this->personService->getAllPersons($this->pagination,$this->userVM->CodiceConto);
    }else{
    $result=$this->personService->getAllPersons($this->pagination);
    }
    $list=$result['list'];
    if(isset(
    $result['totalRows'])){
    $this->pagination->setTotalLinks($result['totalRows']);
    }
    $this->content=view('persons'.DIRECTORY_SEPARATOR.'index',[
    'info'=>$info,
    'list'=>$list,
    'pagination'=>$this->pagination]);
    }
    il codice della view 'index' è:
    Codice PHP:
    ...
    <?php
    $r
    =0;
    foreach (
    $list as $row) {
    $r++;
    ?>
    <th scope="row" class="hrow"><?= $r ?></th>
    <td>...</td>

    <td>
    <form class="form-inline" id="frmUpdate" action="/contact/detail/<?=$row->ID?>" method="GET">
    <button class="btn btn-sm btn-outline-primary" type="submit">
    <i class="fa-solid fa-file-lines mr-1"></i>detail
    </button>
    </form>
    </td>
    <td>
    ....
    </td>
    e infine il codice del servizio è:
    Codice PHP:
    public function getAllPersons(PersonPagInfoModel $pagination,string $code='')
    {
    ......
    if(!empty(
    $code)){

    $sql="SELECT * FROM anagrafe WHERE ....' "
    . "OR ....' "
    . "OR .... "
    . "OR CodiceConto LIKE '%".$search."%' ";
    }else{
    $sql="SELECT * FROM anagrafe WHERE "
    . "CodiceConto ='".$code."' ";
    }
    $totalRows=$this->getTotalRows($sql);
    $sql .= "ORDER BY $orderby $orderdir LIMIT $offset,$limit";
    ....
    return
    $result;
    }
    ed ecco cosa succede: quando l'utente è un amministratore, cliccando sul bottone 'DETAIL' tutto procede, qunado l'utente è 'GUEST', viene fuori la seegnalazione

    SQLSTATE 42502: Base Table or view not found: 1146 Table 'nomesito.Anagrafe' doesn't exists
    si badi al nome della tabella con l'iniziale A maiuscola, che non è stata inserita da nessuna parte.
    Se conoscete una risposta a questo vi ringrazierò per tutta la vita.
    Ultima modifica di dreadnaut : 28-03-2023 alle ore 19.24.18 Motivo: + tag [php] attorno al codice

  2. #2
    L'avatar di dreadnaut
    dreadnaut non è connesso Super Moderatore
    Data registrazione
    22-02-2004
    Messaggi
    6,260

    Predefinito

    Citazione Originalmente inviato da isolaverdebasketit Visualizza messaggio
    Se conoscete una risposta a questo vi ringrazierò per tutta la vita.
    Con che frequenza? A voce, per iscritto... come indendi ringraziarci? Non so se voglio rispondere, che poi magari mi appari sul lavoro o quando vado al supermercato. È un po' rischioso ecco

    Invece di rispondere ti farò una domanda. Perché in questo punto...
    Codice PHP:
    if (!empty($code)) {
    $sql="SELECT * FROM anagrafe WHERE ....' "
    . "OR ....' "
    . "OR .... "
    . "OR CodiceConto LIKE '%".$search."%' ";
    } else {
    $sql="SELECT * FROM anagrafe WHERE "
    . "CodiceConto ='".$code."' ";
    }
    controlli !empty($code), ma poi usi $code nel ramo else, dove sai che è vuoto?


    Suggerimenti generali:
    - se hai un if/else con una condizione che comincia per !, è facile confondersi; togli la negazione, e scambia i blocchi then ed else
    - se ti ritrovi con un metodo che fa due query diverse in base ad un parametro, è meglio dividerlo in due metodi separati.

    Bonus: l'interpolazione delle stringhe (inserire stringhe dentro altre, invece di concatenarle con .) rende le query più leggibili. Ad esempio:
    Codice PHP:
    $query = <<<FINE
    SELECT * FROM anagrafe WHERE field = 'value'
    OR column IS NULL
    OR CodiceConto LIKE '%
    {$search}%'
    FINE;

    $sql = "SELECT * FROM anagrafe WHERE CodiceConto = '{$code}'";
    Considera però l'uso di prepared statement, invece di infilare valori dentro una query senza controlli: rischi un 327
    Ultima modifica di dreadnaut : 28-03-2023 alle ore 19.46.32

  3. #3
    Data registrazione
    09-12-2022
    Messaggi
    4

    Predefinito

    grazie per avere risposto, .. nb frequenza 102 e 500 come in un vecchio film.
    Innanzitutto devo precisare che, prima di leggere questa risposta, ho scoperto che la tabella veniva chiamata, con il nome di 'Anagrafe', anche in un altro metodo e quindi ho risolto.
    Per quello che riguarda la tua domanda ti dirò che quel punto esclamativo è semplicemente il derivato di un copia e incolla di una precedente prova che poi non avevo correttamente ripristinato e per questo devo scusarmi.
    e infine grazie ancora per il bonus.
    In effetti già altre piccole differenze di 'comportamento' del server locale rispetto al server di produzione altervista, le avevo trovate e superate con un poco di pazienza, ma questa che mi sembrava riguardare il database direttamente mi mancava e mi aveva messo in subbuglio

  4. #4
    Data registrazione
    09-12-2022
    Messaggi
    4

    Predefinito

    grazie per avere risposto, .. nb frequenza 102 e 500 come in un vecchio film.
    Innanzitutto devo precisare che, prima di leggere questa risposta, ho scoperto che la tabella veniva chiamata, con il nome di 'Anagrafe', anche in un altro metodo e quindi ho risolto.
    Per quello che riguarda la tua domanda ti dirò che quel punto esclamativo è semplicemente il derivato di un copia e incolla di una precedente prova che poi non avevo correttamente ripristinato e per questo devo scusarmi.
    e infine grazie ancora per il bonus.
    In effetti già altre piccole differenze di 'comportamento' del server locale rispetto al server di produzione altervista, le avevo trovate e superate con un poco di pazienza, ma questa che mi sembrava riguardare il database direttamente mi mancava e mi aveva messo in subbuglio

Tags for this Thread

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •