Classe database: restiruire array da query

peppeocchi

Utente Attivo
20 Apr 2013
30
0
0
Ciao a tutti,
ho un quesito che mi sta "mangiando l'anima".

Ho la mia bella classe database, con le classiche funzioni
connetti() <- connette al database
query() <- esegue una query

fetchrow() <- ????
fetchall() <- ???

poi ho il mio bel file php che creato l'oggetto, esegue
connessione
query: fa una select dei dati di una tabella
chiamata a fetchall
output risultati

posto un po' di codice così è più chiaro

la classe
PHP:
<?php
class mysql_db
{
	private $sql;

	public function __construct($username, $password, $database, $host)	{
		if($conn = mysql_connect($host,$username,$password) or die (mysql_error())) {
			$selectDB = mysql_select_db($database,$conn) or die (mysql_error());
		}
	}

	public function query($sql) {
		$this->sql = mysql_query($sql) or die (mysql_error());
	}

	public function fetchrow() {
		
	}

	public function fetchall() {
		
	}

	public function __destruct() {
		mysql_close();
	}
}
?>

e l'altro file
PHP:
require_once("mysql.php");

//Create the mySQL object
$sqlDB = new mysql_db('username', 'password', 'database', 'localhost');

//perform an sql query to select the first 10 values in the db
$sqlDB->query("SELECT * FROM test ORDER BY id ASC LIMIT 10");

//get the 10 rows
$rows = $sqlDB->fetchall();

foreach ($rows as $row)
{
	echo $row['id'].": ".$row['name']."<br/>";
}

Bene, come proseguo? In pratica con fetchall() dovrei restituire l'array della select.
Ho provato con "return mysql_fetch_array($this->sql)", ma restituisce le prime due righe della tabella.
L'utilità dell'altra funzione fetchrow() qual'è secondo voi?
 
Prova cosi
PHP:
public function fetchall() { 
         $return = array();
         while($row=mysql_fetch_array($this->sql)) $return[] = $row;
         return $return;
    }

Comunque mysql è deprecato, vedi mysqli o pdo con i loro metodi fetch_all o fetchAll
 
Ottimo funziona, grazie mille!

Invece riguardo a fetchrow()?

Qualche idea sull'utilità di questa funzione?

Scusa la mia domanda da ignorante, ma ha senso usare PDO o mysqli dentro questa classe?
Cioè, non hanno i loro metodi per connessione query eccetera?
Non creerei dei metodi di metodi?
Ha senso creare un metodo come questo?

public function query($sql) {
mysqli->query($sql);
}


Grazie per la pazienza
 
Ottimo funziona, grazie mille!

Invece riguardo a fetchrow()?

Qualche idea sull'utilità di questa funzione?
In che senso? E' vuoto quel metodo

Scusa la mia domanda da ignorante, ma ha senso usare PDO o mysqli dentro questa classe?
Cioè, non hanno i loro metodi per connessione query eccetera?
Non creerei dei metodi di metodi?
Un metodo lo puoi chiamare anche pinco_pallo, ma la cosa principale non è come si chiama ma cosa fa

Ha senso creare un metodo come questo?

public function query($sql) {
mysqli->query($sql);
}

Grazie per la pazienza
E' sintatticamente errato, dovrebbe essere $this->mysqli->query($sql), dove ovviamente mysqli sarebbe la nuova istanza di mysqli.
Comunque detto ciò aggiungi magari la gestione degli errori o un opzione (tramite argomento della funzione ad esempio) che permetta di avere direttamente il fetch o il numero dei record trovati
 
Nel senso che mi hanno dato questi due file
PHP:
<?php
require_once("mysql.php");

//Create the mySQL object
$sqlDB = new mysql_db('root', 'p3pp3', 'testami', 'localhost');

//perform an sql query to select the first 10 values in the db
$sqlDB->query("SELECT * FROM test ORDER BY id ASC LIMIT 10");

//get the 10 rows
$rows = $sqlDB->fetchall();

foreach ($rows as $row)
{
	echo $row['id'].": ".$row['name']."<br/>";
}

//insert a new value
$newID = $sqlDB->insert("test", array("name" => "Hello World!"));

//update the value to a new value
$sqlDB->update("test", array("name" => "Goodbye World!"), "id = $newID");
e
PHP:
<?php
/**
mysql Class
You are required to complete this unfinished class so that test.php runs as it is meant to
You may also add in any error reporting or analytics that you feel would improve this class
**/

class mysql_db
{

	public function __construct($username, $password, $database, $host)	{
	
	}

	public function query($sql) {
	}

	public function insert($table, $values) {
	}
	
	public function update($table, $values, $where) {
	}

	public function fetchrow() {
	}

	public function fetchall() {
		
	}

}
?>

Ovviamente questo secondo file lo devo completare io, il primo non lo posso modificare.
E' un test, io in genere uso PDO per le operazioni di connessione e gestione del database, ma credo sarebbe strano se mi chiedessero di costruire una classe e dentro gli mettessi un'istanza PDO che fa quello che in realtà dovrei scrivere io in quei metodi.
 
Nel senso che mi hanno dato questi due file
PHP:
<?php
require_once("mysql.php");

//Create the mySQL object
$sqlDB = new mysql_db('root', 'p3pp3', 'testami', 'localhost');

//perform an sql query to select the first 10 values in the db
$sqlDB->query("SELECT * FROM test ORDER BY id ASC LIMIT 10");

//get the 10 rows
$rows = $sqlDB->fetchall();

foreach ($rows as $row)
{
	echo $row['id'].": ".$row['name']."<br/>";
}

//insert a new value
$newID = $sqlDB->insert("test", array("name" => "Hello World!"));

//update the value to a new value
$sqlDB->update("test", array("name" => "Goodbye World!"), "id = $newID");
e
PHP:
<?php
/**
mysql Class
You are required to complete this unfinished class so that test.php runs as it is meant to
You may also add in any error reporting or analytics that you feel would improve this class
**/

class mysql_db
{

	public function __construct($username, $password, $database, $host)	{
	
	}

	public function query($sql) {
	}

	public function insert($table, $values) {
	}
	
	public function update($table, $values, $where) {
	}

	public function fetchrow() {
	}

	public function fetchall() {
		
	}

}
?>

Ovviamente questo secondo file lo devo completare io, il primo non lo posso modificare.
E' un test, io in genere uso PDO per le operazioni di connessione e gestione del database, ma credo sarebbe strano se mi chiedessero di costruire una classe e dentro gli mettessi un'istanza PDO che fa quello che in realtà dovrei scrivere io in quei metodi.
Chi ti ha detto di implementare la classe ti ha anche detto cosa dovranno fare precisamente i metodi? Riscoprire l'acqua calda non serve a niente, ne tanto meno farlo con un vecchio rubinetto(mysql). Se vuoi una buona esercitazione potresti provare ad organizzare una classe per la preparazione e i risultati di una query con PDO.

es.
PHP:
public function query($query,$valori=array()){
  try{

      $this->result = $this->pdo->prepare($query);
      $this->result->execute($valori); 

   }catch(PDOExcpetion $e){ die($e->getMessage()); }
}
 
Ultima modifica:
Chi ti ha detto di implementare la classe ti ha anche detto cosa dovranno fare precisamente i metodi?

I metodi devono permettere all'altro file di completare correttamente l'esecuzione, ma non essendoci traccia di fetchrow(), probabilmente volevano che lo usassi dentro la classe.

Il fatto è che guardando il codice del primo file che mi hanno dato, ha davvero poco senso, e soprattutto inutile, tirare su una classe con tutti questi metodi.
faccio un ciclo dentro la classe nel metodo fetchall(), che restituisce un array, e faccio un altro ciclo per mandarne in output il contenuto.
fetchall e fetchrow non prendono in input nessun parametro.

E' un test per vedere quanto me la cavo con la programmazione ad oggetti.
Quello che penso io è che dovrei richiamare fetchrow() dentro al ciclo di fetchall() mantenendo l'accoppiamento key => valore.

Sono solo io che vedo tanta inutilità in questa classe?

Tra l'altro non posso organizzarla neanche come mi pare, ho quei metodi che prendono quei parametri.
 
I metodi devono permettere all'altro file di completare correttamente l'esecuzione, ma non essendoci traccia di fetchrow(), probabilmente volevano che lo usassi dentro la classe.

Il fatto è che guardando il codice del primo file che mi hanno dato, ha davvero poco senso, e soprattutto inutile, tirare su una classe con tutti questi metodi.
faccio un ciclo dentro la classe nel metodo fetchall(), che restituisce un array, e faccio un altro ciclo per mandarne in output il contenuto.
fetchall e fetchrow non prendono in input nessun parametro.

E' un test per vedere quanto me la cavo con la programmazione ad oggetti.
Se è un'esercitazione prova ad idearla te una classe per la gestione delle query, non basarti sul far girare un determinato file, e dato che dovrebbe essere un'esercitazione per l'oop ti consiglio vivamente di farla con mysqli o pdo, con mysql non avrebbe senso.

Quello che penso io è che dovrei richiamare fetchrow() dentro al ciclo di fetchall() mantenendo l'accoppiamento key => valore.

Sono solo io che vedo tanta inutilità in questa classe?

Tra l'altro non posso organizzarla neanche come mi pare, ho quei metodi che prendono quei parametri.
fetch_all()
 

Discussioni simili