• User

    Classe PHP per iterazioni mysql

    Ciao a tutti,
    sto lavorando ad alcune pagine php per interagire con i dati contenuti in un db MySql e per comodità sto cercando una classe da includere e che mi faciliti un po' il lavoro oltre a renderlo più leggibile. Tra le diverse che ho trovato,quella che mi è sembrata un po' più interessante è quella di Sebastien Laout,non so se qualcuno ha provato a lavorarci...
    Il problema che mi si presenta è il seguente,scarico la classe, la estraggo nella cartella dove sono presenti le pagine su cui lavoro e provo a includerla in una pagina di prova con:
    include "db.class.php";
    Poi creo un oggetto DB come specificato anche nelle note dell'autore ma appena provo ad aprire la pagina mi dice che non è possibile includere la classe e che non esiste nessun oggetto di tipo DB......
    Avete qualche dritta da darmi?


  • User Attivo

    Ciao e benvenuto nel forum.
    Non sarebbe male se mettessi il link alla classe e il codice che hai provato.
    Il link copialo senza http iniziale.


  • User

    La classe l'ho trovata da qui slaout.linux62.org/php/index.html
    Il codice era solo per provare la connessione al db quindi
    <?php
    include "db.class.php";
    $db = new DB("nomeDB","localhost","root","psw");
    ?>
    O comunque qualcosa di molto simile,non ho il codice sottomana :S


  • User Attivo

    La classe è scritta in php 4. Il codice utilizza gli short tag <? anzichè <?php
    Lasciando tutto com'è tranne gli short tag e mettendo uno script nella stessa cartella su server locale XAMPP, ha funzionato tutto a dovere
    [PHP]
    <?php
    include "db.class.php";
    $db = new DB("prova","localhost","root","");
    $res = $db->query('select * from utenti');
    echo mysql_num_rows($res); //risultato: 1 (esatto)
    ?>
    [/PHP]
    Che il tuo sia un problema di path errato dell'include?


  • User Attivo

    Ho aggiornato la classe a PHP5 e a mysqli.
    Il funzionamento rimane quello originario.
    [PHP]
    <?php
    /** A PHP class to access MySQL database with convenient methods
    * in an object oriented way, and with a powerful debug system.\n
    * Licence: LGPL \n
    * Web site: http://slaout.linux62.org/
    * @version 1.0
    * @author Sébastien Laoût ([email protected])
    /
    class DB
    {
    /
    * Put this variable to true if you want ALL queries to be debugged by default:
    */
    private $defaultDebug = false;

    /** INTERNAL: The start time, in miliseconds.
      */
    private $mtStart;
    /** INTERNAL: The number of executed queries.
      */
    private $nbQueries;
    /** INTERNAL: The last result ressource of a query().
      */
    

    private $lastResult;

    /** RESOURCE to DB
    */
    private $cnt;

    /** Connect to a MySQL database to be able to use the methods below.
      */
    function __construct($base, $server, $user, $pass)
    {
      $this->mtStart    = $this->getMicroTime();
      $this->nbQueries  = 0;
      $this->lastResult = NULL;
     $this->cnt = mysqli_connect($server, $user, $pass, $base) or die('Server connexion not possible.');
     
    }
    
    /** Query the database.
      * @param $query The query.
      * @param $debug If true, it output the query and the resulting table.
      * @return The result of the query, to use with fetchNextObject().
      */
    function query($query, $debug = -1)
    {
      $this->nbQueries++;
      $this->lastResult = mysqli_query($this->cnt, $query) or $this->debugAndDie($query);
    
      $this->debug($debug, $query, $this->lastResult);
    
      return $this->lastResult;
    }
    /** Do the same as query() but do not return nor store result.\n
      * Should be used for INSERT, UPDATE, DELETE...
      * @param $query The query.
      * @param $debug If true, it output the query and the resulting table.
      */
    function execute($query, $debug = -1)
    {
      $this->nbQueries++;
      mysqli_query($this->cnt,$query) or $this->debugAndDie($query);
    
      $this->debug($debug, $query);
    }
    /** Convenient method for mysql_fetch_object().
      * @param $result The ressource returned by query(). If NULL, the last result returned by query() will be used.
      * @return An object representing a data row.
      */
    function fetchNextObject($result = NULL)
    {
      if ($result == NULL)
        $result = $this->lastResult;
    
      if ($result == NULL || mysqli_num_rows($result) < 1)
        return NULL;
      else
        return mysqli_fetch_object($result);
    }
    /** Get the number of rows of a query.
      * @param $result The ressource returned by query(). If NULL, the last result returned by query() will be used.
      * @return The number of rows of the query (0 or more).
      */
    function numRows($result = NULL)
    {
      if ($result == NULL)
        return mysqli_num_rows($this->lastResult);
      else
        return mysqli_num_rows($result);
    }
    /** Get the result of the query as an object. The query should return a unique row.\n
      * Note: no need to add "LIMIT 1" at the end of your query because
      * the method will add that (for optimisation purpose).
      * @param $query The query.
      * @param $debug If true, it output the query and the resulting row.
      * @return An object representing a data row (or NULL if result is empty).
      */
    function queryUniqueObject($query, $debug = -1)
    {
      $query = "$query LIMIT 1";
    
      $this->nbQueries++;
      $result = mysqli_query($this->cnt,$query) or $this->debugAndDie($query);
    
      $this->debug($debug, $query, $result);
    
      return mysqli_fetch_object($result);
    }
    /** Get the result of the query as value. The query should return a unique cell.\n
      * Note: no need to add "LIMIT 1" at the end of your query because
      * the method will add that (for optimisation purpose).
      * @param $query The query.
      * @param $debug If true, it output the query and the resulting value.
      * @return A value representing a data cell (or NULL if result is empty).
      */
    function queryUniqueValue($query, $debug = -1)
    {
      $query = "$query LIMIT 1";
    
      $this->nbQueries++;
      $result = mysqli_query($this->cnt,$query) or $this->debugAndDie($query);
      $line = mysqli_fetch_row($result);
    
      $this->debug($debug, $query, $result);
    
      return $line[0];
    }
    /** Get the maximum value of a column in a table, with a condition.
      * @param $column The column where to compute the maximum.
      * @param $table The table where to compute the maximum.
      * @param $where The condition before to compute the maximum.
      * @return The maximum value (or NULL if result is empty).
      */
    function maxOf($column, $table, $where)
    {
      return $this->queryUniqueValue("SELECT MAX(`$column`) FROM `$table` WHERE $where");
    }
    /** Get the maximum value of a column in a table.
      * @param $column The column where to compute the maximum.
      * @param $table The table where to compute the maximum.
      * @return The maximum value (or NULL if result is empty).
      */
    function maxOfAll($column, $table)
    {
      return $this->queryUniqueValue("SELECT MAX(`$column`) FROM `$table`");
    }
    /** Get the count of rows in a table, with a condition.
      * @param $table The table where to compute the number of rows.
      * @param $where The condition before to compute the number or rows.
      * @return The number of rows (0 or more).
      */
    function countOf($table, $where)
    {
      return $this->queryUniqueValue("SELECT COUNT(*) FROM `$table` WHERE $where");
    }
    /** Get the count of rows in a table.
      * @param $table The table where to compute the number of rows.
      * @return The number of rows (0 or more).
      */
    function countOfAll($table)
    {
      return $this->queryUniqueValue("SELECT COUNT(*) FROM `$table`");
    }
    /** Internal function to debug when MySQL encountered an error,
      * even if debug is set to Off.
      * @param $query The SQL query to echo before diying.
      */
    function debugAndDie($query)
    {
      $this->debugQuery($query, "Error");
      die("<p style=\"margin: 2px;\">".mysqli_error($this->cnt)."</p></div>");
    }
    /** Internal function to debug a MySQL query.\n
      * Show the query and output the resulting table if not NULL.
      * @param $debug The parameter passed to query() functions. Can be boolean or -1 (default).
      * @param $query The SQL query to debug.
      * @param $result The resulting table of the query, if available.
      */
    function debug($debug, $query, $result = NULL)
    {
      if ($debug === -1 && $this->defaultDebug === false)
        return;
      if ($debug === false)
        return;
    
      $reason = ($debug === -1 ? "Default Debug" : "Debug");
      $this->debugQuery($query, $reason);
      if ($result == NULL)
        echo "<p style=\"margin: 2px;\">Number of affected rows: ".mysqli_affected_rows($this->cnt)."</p></div>";
      else
        $this->debugResult($result);
    }
    /** Internal function to output a query for debug purpose.\n
      * Should be followed by a call to debugResult() or an echo of "</div>".
      * @param $query The SQL query to debug.
      * @param $reason The reason why this function is called: "Default Debug", "Debug" or "Error".
      */
    function debugQuery($query, $reason = "Debug")
    {
      $color = ($reason == "Error" ? "red" : "orange");
      echo "<div style=\"border: solid $color 1px; margin: 2px;\">".
           "<p style=\"margin: 0 0 2px 0; padding: 0; background-color: #DDF;\">".
           "<strong style=\"padding: 0 3px; background-color: $color; color: white;\">$reason:</strong> ".
           "<span style=\"font-family: monospace;\">".htmlentities($query)."</span></p>";
    }
    /** Internal function to output a table representing the result of a query, for debug purpose.\n
      * Should be preceded by a call to debugQuery().
      * @param $result The resulting table of the query.
      */
    function debugResult($result)
    {
      echo "<table border=\"1\" style=\"margin: 2px;\">".
           "<thead style=\"font-size: 80%\">";
      $numFields = mysqli_num_fields($result);
      // BEGIN HEADER
      $tables    = array();
      $nbTables  = -1;
      $lastTable = "";
      $fields    = array();
      $nbFields  = -1;
      while ($column = mysqli_fetch_field($result)) {
        if ($column->table != $lastTable) {
          $nbTables++;
          $tables[$nbTables] = array("name" => $column->table, "count" => 1);
        } else
          $tables[$nbTables]["count"]++;
        $lastTable = $column->table;
        $nbFields++;
        $fields[$nbFields] = $column->name;
      }
      for ($i = 0; $i <= $nbTables; $i++)
        echo "<th colspan=".$tables*["count"].">".$tables*["name"]."</th>";
      echo "</thead>";
      echo "<thead style=\"font-size: 80%\">";
      for ($i = 0; $i <= $nbFields; $i++)
        echo "<th>".$fields*."</th>";
      echo "</thead>";
      // END HEADER
      while ($row = mysqli_fetch_array($result)) {
        echo "<tr>";
        for ($i = 0; $i < $numFields; $i++)
          echo "<td>".htmlentities($row*)."</td>";
        echo "</tr>";
      }
      echo "</table></div>";
      $this->resetFetch($result);
    }
    /** Get how many time the script took from the begin of this object.
      * @return The script execution time in seconds since the
      * creation of this object.
      */
    function getExecTime()
    {
      return round(($this->getMicroTime() - $this->mtStart) * 1000) / 1000;
    }
    /** Get the number of queries executed from the begin of this object.
      * @return The number of queries executed on the database server since the
      * creation of this object.
      */
    function getQueriesCount()
    {
      return $this->nbQueries;
    }
    /** Go back to the first element of the result line.
      * @param $result The resssource returned by a query() function.
      */
    function resetFetch($result)
    {
      if (mysqli_num_rows($result) > 0)
        mysqli_data_seek($result, 0);
    }
    /** Get the id of the very last inserted row.
      * @return The id of the very last inserted row (in any table).
      */
    function lastInsertedId()
    {
      return mysqli_insert_id($this->cnt);
    }
    /** Close the connexion with the database server.\n
      * It's usually unneeded since PHP do it automatically at script end.
      */
    function __destruct()
    {
      mysqli_close($this->cnt);
    }
    
    /** Internal method to get the current time.
      * @return The current time in seconds with microseconds (in float format).
      */
    function getMicroTime()
    {
      list($msec, $sec) = explode(' ', microtime());
      return floor($sec / 1000) + $msec;
    }
    

    } // class DB
    ?>
    [/PHP]
    Premetto che non sono stato a guardare la logica della classe ma esclusivamente il codice. Non garantisco che mi sia sfuggito qualcosa, ma dalle prove che ho fatto funziona.


  • User

    Innanzitutto ti ringrazio per il tempo che mi hai dato 🙂 La classe così come l'hai scritta mi da un errore legato ad una funzione mysqli ma comunque ho risolto semplicemente sostituendo nella classe "<?" con "<?php".....
    Quando mi ha funzionato quasi non ci volevo credere,per una cosa simile :rollo:
    Buona serata!


  • User Attivo

    Mi dici che errore mysqli ti ha dato?


  • User

    L'errore era sulla funzione mysqli_num_rows in quanto riceveva in input una stringa... Non mi sono segnato la riga ma se non sbaglio era quando veniva richiamata in fetchNextObject