Van mysql naar mysqli
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
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
<?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'];
?>
// 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'];
?>
Gewijzigd op 06/08/2016 09:49:04 door Frank Nietbelangrijk
Dit werkt,en doet wat het moet doen.
Nu kan ik vanavond verder puzzelen. :-)
Gewijzigd op 06/08/2016 10:47:26 door Theo Luwema
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?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
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;
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:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
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;
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;
Gewijzigd op 04/09/2016 10:45:31 door Theo Luwema
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?
Gewijzigd op 04/09/2016 09:11:05 door - Ariën -
- 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?
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.
Maar ergens in je code roep je de class aan met:
$iets = new DogDAO();
Kan je dat vinden?
Gewijzigd op 04/09/2016 16:59:37 door - Ariën -
- 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?
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:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?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)) {
?>
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();
Gewijzigd op 05/09/2016 07:18:31 door Theo Luwema
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).
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?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) {
/* .... */
}
}
?>
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:
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.
Gewijzigd op 05/09/2016 17:21:25 door - Ariën -
Wel zo netjes om dan even $connection als property in te stellen ... ;)
Juist'em dat was ik nog even vergeten.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
<?php
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 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;
}
?>
Uiteraard! :-)
Veriabelen? Wa's dè vur 'n diejalèkt :-)
Of Stadjeders, mag van mij ook. Als Assenaar kies ik voor de eerste :)
Gewijzigd op 05/09/2016 18:16:46 door Ben van Velzen
Hehe, oké dan ;-)
Ik zal de tutorial eens aandachtig bestuderen.
Maar het is voor mij toch lastiger als ik dacht.......
Zijn er mensen op dit forum die dit graag als hobby doen?
Ik ben ben wel bereid een vergoeding te betalen,maar ik kan niet veel vergoeden omdat het een
Vrijwilligerssite is.
We kunnen ook via het forum helpen, maar als je het wilt laten doen door iemand anders dan ben je vrij om een vacature in het Vacatureforum te plaatsen.