Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    Errore "supplied argument is not a valid MySQL result"

    Salve a tutti, ho un problema che, da quanto ho appreso in seguito ad una facile ricerca su internet, sembra molto comune. A me personalente non era mai capitato.
    Ho creato uno script FUNZIONANTE su un server gratuito altervista e poi ho spostato il tutto su di un altro. Tra i tanti problemi che mi fa (eccone un altro) ora ce ne è uno che mi sembra assurdo. Non gli piace il risultato che tira fuori da alcune query, perchè dice:

    "Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in {path} on line 23"

    una delle query è questa:
    "$query = "SELECT * FROM tabella WHERE email='$email'";
    $result = mysql_query($query, $db) or die ("Errore nella query al database. $query.". mysql_error());
    while ($row = mysql_fetch_array($result)){...}"

    La cosa ancora più strana aè la query viene CMQ ESEGUITA e i valori estratti e tutto funziona (almeno apparentemente). Solo che da questo errore che prima, nell'altro server, non dava.
    Mi sapete aiutare? Ha un urgenza che definire urgente è poco, mannaggia.
    All'uomo non verrà mai tanto male quanto dall'uomo.

  2. #2
    Puoi postare una decina di righe prima della 23 (compresa)?

  3. #3
    Certo. Ecco:

    Codice PHP:
    <?php ob_start(); ?>

    <html>
    <head>
        <title>titolo</title>
    </head>

    <body>

    <?php
    include ('connection.inc.php');
    ?>

    <?php
    $email
    =$_GET['email'];
    $codice=$_GET['codice'];

    $query "SELECT * FROM tabella WHERE email='$email'";
    $result mysql_query($query$db) or die ("Errore nella query al database. $query."mysql_error());
    while (
    $row mysql_fetch_array($result)){...}
    All'uomo non verrà mai tanto male quanto dall'uomo.

  4. #4
    Tranasciando gli evidenti problemi di sicurezza del tuo codice (es. SQL Injection), sei sicuro che la riga 23 sia effettivamente "while ($row = mysql_fetch_array($result))" e non una successiva?
    Se inserisci un var_dump($result) dopo la chiamata a mysql_query() che cosa ottieni?

  5. #5
    Ottengo "Resource id #4".
    Che mi sembra strano anche perchè non corrisponde a nessun valore del database.

    Ti andrebbe di spiegarmi come posso rendere più sicuro il codice? E' una attivazione di account via email. nell'email c'è l'url che contiene i dati utili all'attivazione dell'utente.
    All'uomo non verrà mai tanto male quanto dall'uomo.

  6. #6
    Originariamente inviato da Tremisfero
    Ottengo "Resource id #4".
    Che mi sembra strano anche perchè non corrisponde a nessun valore del database.

    Ti andrebbe di spiegarmi come posso rendere più sicuro il codice? E' una attivazione di account via email. nell'email c'è l'url che contiene i dati utili all'attivazione dell'utente.
    se proprio sicuro sia quella la query che ti da l'errore?

    Se il resource id# non fosse valido riceveresti l'errore dal DIE della riga precedente.

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  7. #7
    Originariamente inviato da Tremisfero
    Ottengo "Resource id #4".
    Che mi sembra strano anche perchè non corrisponde a nessun valore del database.
    è perfettamente normale che il var dump restituisca quel valore perché "result" non è il contenuto della query ma una risorsa che serve a identificare il contenuto della query e va usata con le funzioni di estrazioni o simili dell'estensione di mysql

    Ti andrebbe di spiegarmi come posso rendere più sicuro il codice? E' una attivazione di account via email. nell'email c'è l'url che contiene i dati utili all'attivazione dell'utente.
    beh, diciamo che ora come ora tutto dipende dal provider: inserendo $email così, senza effettuare controlli e effettuare l'escape del testo, se il provider, l'ISP, ha il magic_quote_gpc su off, quindi non effettua lui l'escape, ti succede un gran patacrac ... ovvero $email può essere modificato per contenere un pezzo di una query SQL

    Se il campo email conterrebbe ad esempio
    ' OR 0 UNION ALL SELECT username,password..... FROM utenti WHERE '1' = '1

    La query diventerebbe da
    SELECT * FROM tabella WHERE email='$email'

    A
    SELECT * FROM tabella WHERE email='' OR 0 UNION ALL SELECT username,password..... FROM utenti WHERE '1' = '1'

    La seconda select deve contenenre un numero di campi corrispondente a quelli presenti nella prima tabella, ma come vedi si potrebberò andare ad estrarre un altro tipo di dati

    Ovviamente dipende dal tipo di pagina: se fai solo dei controlli interni per vedere se l'email è già attivata o è da attivare, alla fin fine non servirà a molto però comunque è un potenziale problema molto pericolo!

    Dai un occhio a
    www.php.net/mysql_escape_string

    o
    www.php.net/mysql_real_escape_string

    e
    www.php.net/stripslashes

    e
    www.php.net/addslashes

    Inoltre dovresti anche dare un occhio a
    www.php.net/get_magic_quotes_gpc

    Perché prima di lanciare l'escape dovresti togliere gli apici tramite stripslashes se l'ISP ha configurato php per farli mettere in auto
    The fastest Redis alternative ... cachegrand! https://github.com/danielealbano/cachegrand

  8. #8
    Quella è una delle query che mi da problemi... sono quasi tutte che fanno quell'errore: non accettano il mysql_fetch_array che impongo.
    All'uomo non verrà mai tanto male quanto dall'uomo.

  9. #9
    Mi sono reso conto che tutte le query con SELECT mi danno quel cproblema, perchè sono le uniche che usano "mysql_fetch_array". Quindi in potenza danno tutte quell'errore. Ma vengono cmq eseguite!
    All'uomo non verrà mai tanto male quanto dall'uomo.

  10. #10
    Originariamente inviato da Tremisfero
    Mi sono reso conto che tutte le query con SELECT mi danno quel cproblema, perchè sono le uniche che usano "mysql_fetch_array". Quindi in potenza danno tutte quell'errore. Ma vengono cmq eseguite!
    probabilmente prima ti stampa delle righe e poi ti da l'errore. Quindi il codice che hai postato non e' completo/reale.

    In pratica, per qualche ragione, la chiamata al buffer del result set continua anche dopo che e' stata raggiunta la fine del buffer. In altre parole e' come se il while non recepisse il false che arriva da mysql_fetch_array(). Controlla come stampi il risultato.

    Tra l'altro..... visto che attendi UNA sola riga come risposta perche' usi while? Un'attivazione di account, come hai detto, non ha ragione di rendere piu' record.

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

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 © 2025 vBulletin Solutions, Inc. All rights reserved.