Beste leden.

Ik beheer een site waar een hondendatabase op draait,de software is al wat ouder.
Ik verander weleens kleine dingetjes,en leer steeds meer over PHP en mysql.
Helaas heeft mijn provider besloten om mijn huidige versie van PHP niet meer te ondersteunen.
Huidige versie is PHP 5.3,de provider gaat nu naar 5.6.
Hierdoor is mijn site een beetje aan het omvallen.

Ik heb nu de errrormeldingen aangezet en ben nu aan het zoeken naar fouten en probeer deze te herstellen.
Sommige zijn me wel gelukt,maar ik heb er nu eentje die ik wel lastig vind,misschien kunnen jullie mij een duwtje in de goeie richting geven?

Onderstaand is de ouwe query:
$query = "SELECT COUNT(ID) FROM dog";
$result = mysql_query($query) or die('Query failed: ' . mysql_error());
$total = mysql_result($result,0);

deze query telt het aantal honden in een bepaalde kolom (dog)

na wat zoek werk heb ik er in mysqli dit van gemaakt:

$query=mysqli_query($connect,"SELECT COUNT(ID) FROM dog");
$result=mysqli_fetch_assoc($query);

het probleem is dat ik niet kan vinden hoe ik de derde regel in mysqli moet maken?
$total = mysql_result($result,0);

op de eerste 2 regels krijg ik geen foutmelding.

Kan iemand mij een duwtje in de juiste richting geven?


Groetjes Theo
<?php
// om een iets makkelijkere kolomnaam te krijgen dan 'COUNT(ID)' gebruik ik 'AS total'.
$query = "SELECT COUNT(ID) AS total FROM dog";

// execute query en verkrijg een resultaat-set.
$result = mysqli_query($connect, $query) or die('Query failed: ' . mysqli_error($connect));

// verkrijg het eerste record of rij (in dit voorbeeld is er maar één record met slechts één 'kolom')
$row = mysqli_fetch_assoc($result);

// nu kopiëren we de waarde van de array naar een gewone variabele. Dit is eigenlijk overbodig, je kunt ook $row['total'] blijven gebruiken.
$total = $row['total'];
?>
Dank je wel Frank!

Dit werkt,en doet wat het moet doen.
Nu kan ik vanavond verder puzzelen. :-)
Ik ben nu een aantal avondjes bezig geweest en ik heb nu een aantal pagina's werkend met MySqli.

Meestal pas ik pagina aan en als er een foutcode optreedt kijk ik wat er mis is.
Nu heb ik een foutmelding die ik niet weg krijg......
Kan iemand mij nog eens een duwtje in de goede richting geven?

 class ShadowDog {
	var $id, $name;
}

class DogDAO {
  
   function DogDAO() {
   }

   function save($vo) {
     if ($vo->id == 0) {
       $this->insert($vo);
     } else {
       $this->update($vo);
     }
   }
   

	function getShadow($id) {
		$query = "SELECT name FROM dog WHERE id=$id";
		$result = mysqli_query($connect, $query) or die('Query failed: ' . mysqli_error($connect));
		$line = mysqli_fetch_object($result);
		$shadowVo = new ShadowDog();
		$shadowVo->id = $id;
		$shadowVo->name = $line->name;	
		return $shadowVo;
	}

   function get($id) {
	// cache not implemented -> needs array in SESSION! -> refresh necessary!
	/*global $dogArray;
   	if (!empty($dogArray[$id])) {
		$dogVo = $dogArray[$id];
		return $dogVo;
	}*/
	$dogVo = $this->getFromDB($id);
 	//$dogArray[$id] = $dogVo;
	return $dogVo;
   }

   function getFromDB($id) {
     #execute select statement
     #create new vo and call getFromResult
     #return vo
		 	$query = "SELECT * FROM dog WHERE id=$id";
			$result = mysqli_query($connect, $query) or die('Query failed: ' . mysqli_error($connect));
			$line = mysqli_fetch_object($result);
			$vo = new Dog();
			$vo->id = $line->id;
			$vo->regnr = $line->reg_nr;
			$vo->name = $line->name;
			$vo->racingname = $line->racing_name;
			$vo->nickname = $line->nickname;



Op de volgende regel :
$result = mysqli_query($connect, $query) or die('Query failed: ' . mysqli_error($connect));

krijg ik constant een foutmelding.

Notice: Undefined variable: connect in /home/vhosting/d/vhost0050361/domains/lutee.nl/htdocs/www/db/class-Dog.php on line 78

Warning: mysqli_query() expects parameter 1 to be mysqli, null given in /home/vhosting/d/vhost0050361/domains/lutee.nl/htdocs/www/db/class-Dog.php on line 78

Notice: Undefined variable: connect in /home/vhosting/d/vhost0050361/domains/lutee.nl/htdocs/www/db/class-Dog.php on line 78

Warning: mysqli_error() expects parameter 1 to be mysqli, null given in /home/vhosting/d/vhost0050361/domains/lutee.nl/htdocs/www/db/class-Dog.php on line 78
Query failed:


De originele code zag er zo uit:

 class ShadowDog {
	var $id, $name;
}

class DogDAO {
  
   function DogDAO() {
   }

   function save($vo) {
     if ($vo->id == 0) {
       $this->insert($vo);
     } else {
       $this->update($vo);
     }
   }
   

	function getShadow($id) {
		$query = "SELECT name FROM dog WHERE id=$id";
		$result = mysql_query($query) or die('Query failed: ' . mysql_error());
		$line = mysql_fetch_object($result);
		$shadowVo = new ShadowDog();
		$shadowVo->id = $id;
		$shadowVo->name = $line->name;	
		return $shadowVo;
	}

   function get($id) {
	// cache not implemented -> needs array in SESSION! -> refresh necessary!
	/*global $dogArray;
   	if (!empty($dogArray[$id])) {
		$dogVo = $dogArray[$id];
		return $dogVo;
	}*/
	$dogVo = $this->getFromDB($id);
 	//$dogArray[$id] = $dogVo;
	return $dogVo;
   }

   function getFromDB($id) {
     #execute select statement
     #create new vo and call getFromResult
     #return vo
		 	$query = "SELECT * FROM dog WHERE id=$id";
			$result = mysql_query($query) or die('Query failed: ' . mysql_error());
			$line = mysql_fetch_object($result);
			$vo = new Dog();
			$vo->id = $line->id;
			$vo->regnr = $line->reg_nr;
			$vo->name = $line->name;
			$vo->racingname = $line->racing_name;
			$vo->nickname = $line->nickname;
Kan je jouw code tussen code-tags plaatsen? Zie ook de Veelgestelde Vragen.

Verder is $connect niet beschikbaar in je functie, dus moet je deze meegeven in je class aanroep meegeven als argument. In de constructor sla je deze op als $connect = $this->connect. En die variabele kan je dan in je hele class gebruiken.

Maar als je toch classes gebruikt, waarom niet meteen de OO versie van MySQLi gebruiken?

- Ariën - op 04/09/2016 08:45:46

Kan je jouw code tussen code-tags plaatsen? Zie ook de Veelgestelde Vragen.

Verder is $connect niet beschikbaar in je functie, dus moet je deze meegeven in je class aanroep meegeven als argument. In de constructor sla je deze op als $connect = $this->connect. En die variabele kan je dan in je hele class gebruiken.

Maar als je toch classes gebruikt, waarom niet meteen de OO versie van MySQLi gebruiken?




Dankje wel Ariën,

Het "probleem" is inderdaad dat de variabele connect niet aanwezig is.
Ik heb dit op de quick en dirty maner getest door de gehele connect regel in te voegen.
Dit is uiteraard niet zo'n mooie manier.

Ik begrijp niet helemaal jou verhaal hoe ik de variable kan aanroepen uit de class.
Kun je hier iets meer over zeggen?
Hoe roep jij nu je class aan?
- Ariën - op 04/09/2016 15:57:24

Hoe roep jij nu je class aan?

Als ik het wist zou ik het gelijk zeggen Ariën.
Probleem is dat deze software is geschreven door een vrouw uit oostenrijk,en ze heeft deze code vrijgegeven voor een ieder om te gebruiken.
Wel met de uitdrukkelijke mededeling dat ze geen support geeft.
Ikzelf probeer mij steeds meer te verdiepen in PHP en SQL.
Ik kan dus simpele PHP wel volgen,maar ik ben geen expert.
Ik merk wel dat als ik de SQLi omzet de rest van code goed overeind blijft.
Dat geeft dus hoop dat het gaat lukken.



Ik zie dat de opbouw van de class ook behoorlijk verouderd is.


Maar ergens in je code roep je de class aan met:

$iets = new DogDAO();
Kan je dat vinden?
- Ariën - op 04/09/2016 16:59:04

Ik zie dat de opbouw van de class ook behoorlijk verouderd is.


Maar ergens in je code roep je de class aan met:

$iets = new DogDAO();
Kan je dat vinden?


Op een andere pagina vond ik dit stukje code:

<?php
include 'db/db_connect.php';
include_once 'db/logic.php';
// array for month
$month_arr = array(1=>"JAN",2=>"FEB",3=>"MAR",4=>"APR",5=>"MAI",6=>"JUN",7=>"JUL",8=>"AUG",9=>"SEP",10=>"OCT",11=>"NOV",12=>"DEC");
// Get dog id from http parameter
$currId = (int)$_GET['id'];
if (!$currId)
$currId=1;
$generations = (int)$_GET['gens'];
if (!$generations)
$generations=4;
$dogDAO = new DogDAO();
$dog = $dogDAO->get($currId);
// if no record with this ID was found in the database
if (empty($dog->id)) {
?>

Hier staat ook de regel :
$dogDAO = new DogDAO();

Kijk, daar kunnen we meer mee.... :-)

Als ik naar je DogDAO class kijk is deze behoorlijk verouderd.
Zo mis ik de PHP5 constructor, en gebruik je nu nog de oude manier van PHP4, waarbij de naam van de method hetzelfde is als de class. In PHP 7 zal dit genegeerd worden, en wordt dit als een aparte method gezien, en dus zal je class de vaste waardes missen.

Ook mis ik de 'visibilities' in je class-structuur.

Als we even voortborduren op de nieuwe opbouw, dan kom ik op dit uit (met ingekorte code voor de overzichtelijkheid).


<?php
class DogDAO { //Rare naam, het zegt niet wat de class doet.
  
   function __construct($connection) {
	$this->connection = $connection;
   }

   public function save($vo) {
     /*  .....  */
   }
  

    public function getShadow($id) {
        $query = "SELECT name FROM dog WHERE id=$id";
        $result = mysqli_query($this->connection, $query) or die('Query failed: ' . mysqli_error($$this->connection));
        $line = mysqli_fetch_object($result);
        $shadowVo = new ShadowDog();
        $shadowVo->id = $id;
        $shadowVo->name = $line->name;    
        return $shadowVo;
    }

   public function get($id) {
	/* .... */
   }

   public function getFromDB($id) {
        /* .... */
   }
}
?>


En de aanroep:

$dogDAO = new DogDAO($connection);


Nog fraaier is om de OO versie van MySQLi erin te integreren. Dan kan je foutmeldingen in een exception afvangen, en die netjes verwerken.

Ik raad je aan om even deze tutorial aandachtig te lezen:
http://www.phptuts.nl/view/45/'. Het is misschien best complex, maar met wat doorzettingsvermogen kan je hier een prima class mee opbouwen, die aan de huidige eisen moet voldoen.

Reageren