Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

$result waar komt die vandaan?

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben bezig met mezelf wat aan het verdiepen in de MySQLi wereld (zelf ken ik een kleine basis MySQL & PHP). Nu ben ik terecht gekomen op een goede website waar ik makkelijk het één en ander kan bijleren, maar begrijp toch niet zo goed waar in onderstaande code die "$result" vandaan komt. Iemand die mij even kan bijbrengen waarom die plots opdaagt in een condition en statement? Is dit misschien een default variable?

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
54
55
56
$mysqli = new mysqli('host', 'user', 'password', 'database');
if(mysqli_connect_errno())
{
    trigger_error('Fout bij verbinding: '.$mysqli->error);
}

// Queries
$queries[] = "UPDATE rekeningen SET saldo = saldo - 1000 WHERE klant = 'A'";
$queries[] = "UPDATE rekeningen SET saldo = saldo + 1000 WHERE klant = 'B'";

// Controle query
$controle = "SELECT saldo FROM rekeningen WHERE klant = 'A'";

// Zet autocommit op FALSE
$mysqli->autocommit(FALSE);

// Uitvoeren van queries en controleren of ze gelukt zijn
foreach($queries as $query)
{
    if(!$result = $mysqli->query($query))
    {
        $errors[$query] = $mysqli->error;
    }
    if($mysqli->affected_rows == 0)
    {
        $errors[$query] = 'Er zijn geen rijen gewijzigd in SQL';
    }
}

// Uitvoeren controle query en controleren waarde
if(!$result = $mysqli->query($controle))
{
    $errors[$controle] = $mysqli->error;
}
else
{
    $row = $result->fetch_assoc();
    if($row['saldo'] < 0)
    {
        $errors[$controle] = 'Het saldo op een rekening is niet toereikend.';
    }
}

// ROLLBACK of COMMIT
if(isset($errors))
{
    $mysqli->rollback();
    foreach($errors as $sql => $error)
    {
        echo '<pre>'.$error.' SQL: '.$sql.'</pre>';
    }
}
else
{
    $mysqli->commit();
}

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
$result komt uit $mysqli->query(...), die if (...) eromheen evalueert of $result FALSE is (geen resultaat) of iets anders* (wel resultaat).

Je had 't ook zo kunnen schrijven:
PHP:
1
2
3
4
$result = $mysqli->query($query);
if ($result !== FALSE) {
  ///... OH NOES!
}

Zie ook de return values van query() ;)

* = mysqli_result to be precise :P

[edit]
En wat Woy hieronder zegt ;) Het is een assignment ( = ), geen comparison ( == of === etc.)

[ Voor 75% gewijzigd door RobIII op 14-01-2014 15:23 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Let vooral op dat er in jouw code $result = .... staat en niet $result == ....

Op regel 20 van je code wordt de variabele $result dus gedefinieerd en meteen gevuld.

De = operator is namelijk een asignment operator, en de == een vergelijkings operator

[ Voor 21% gewijzigd door Woy op 14-01-2014 15:18 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Verwijderd

Topicstarter
RobIII schreef op dinsdag 14 januari 2014 @ 15:16:
$result komt uit $mysqli->query(...), die if (...) eromheen evalueert of $result FALSE is (geen resultaat) of iets anders* (wel resultaat).

Je had 't ook zo kunnen schrijven:
PHP:
1
2
3
4
$result = $mysqli->query($query);
if ($result !== FALSE) {
  ///... OH NOES!
}

Zie ook de return values van query() ;)

* = mysqli_result to be precise :P

[edit]
En wat Woy hieronder zegt ;) Het is een assignment ( = ), geen comparison ( == of === etc.)
Thx dit is duidelijk antwoord op mijn vraag ;)
Vooral uw voorbeeld hoe je het nog kan schrijven hielp me verder!
Thx voor de link maar eerlijk vind ik deze website nogal onoverzichtelijk/slordig zeker voor iemand die er relatief nieuw in is.

  • Morrar
  • Registratie: Juni 2002
  • Laatst online: 21-11 21:44
Woy schreef op dinsdag 14 januari 2014 @ 15:18:
Let vooral op dat er in jouw code $result = .... staat en niet $result == ....

Op regel 20 van je code wordt de variabele $result dus gedefinieerd en meteen gevuld.

De = operator is namelijk een asignment operator, en de == een vergelijkings operator
En nog een stap verder; namelijk de if test of de toewijzing 'succesvol' was, waarbij een toewijzing van false als niet succesvol geldt (ook al heeft de variabele wel de waarde false gekregen).

Verwijderd

Topicstarter
Morrar schreef op dinsdag 14 januari 2014 @ 15:45:
[...]


En nog een stap verder; namelijk de if test of de toewijzing 'succesvol' was, waarbij een toewijzing van false als niet succesvol geldt (ook al heeft de variabele wel de waarde false gekregen).
Is dit dan de meest aan te raden manier of heb je zelf een beter alternatief dan? Ik zit zelf nog met een website die een 3 tal jaar geleden gebouwd is geweest, toen nog met de gewone mysql, in al die tijd een beetje laten rusten en wil die nu graag veiligheids halve toch secure maken daarom deze vraag.

thx

[ Voor 18% gewijzigd door Verwijderd op 14-01-2014 16:33 ]


  • RobertMe
  • Registratie: Maart 2009
  • Nu online
Morrar schreef op dinsdag 14 januari 2014 @ 15:45:
[...]


En nog een stap verder; namelijk de if test of de toewijzing 'succesvol' was, waarbij een toewijzing van false als niet succesvol geldt (ook al heeft de variabele wel de waarde false gekregen).
De if test niet of de toewijzing succesvol was! Een toewijzing zal in principe altijd lukken en anders heb je een groter probleem. Wat er gebeurd is een 'expression' in de vorm van een assignment. En het resultaat van een assignment is hetgeen wat je geassigned hebt.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$foo = 'test'; //het resultaat hiervan is test
$bar = 10; //het resultaat hiervan is 10

//trek je dit door kun je ook dit doen:
$foo = $bar = 1; //zowel $bar als $foo zijn hier 1, dit omdat $bar = 1 als resultaat 1 heeft, en dat weer wordt toegewezen aan $foo

if(!$result = $mysqli->query($controle)) //zegt dus eigenlijk het volgende:
// 1. Voer $mysqli->query uit, dit levert false of een mysqli_result op
// 2. Wijs dit toe aan $result, dit is dus ($result = ->query), en levert dus ook false of een mysqli_result op
// 3. Controleer of dit ($result) niet true is

//een andere schrijfwijze kan dan zijn:
if(! ( $result = $mysqli->query($controle) ) ) //extra haakjes toegevoegd ter verduidelijking
//wat je dan ook weer kunt schrijven als
$result =$mysqli->query($controle);
if(!$result)
//de schrijfwijze van RobIII is daarbij nog iets beter/'veiliger', en zou samengevoegd dit zijn
if(($result = $mysqli->query($controle)) !== false)


Kijk daarnaast ook eens naar PDO. Dit omdat mysqli intussen ook alweer redelijk achterhaald is, of in ieder geval ingehaald door PDO.

  • PatrickH89
  • Registratie: November 2009
  • Laatst online: 22-11 17:47
Op zich is er met mysqli weinig mis naar mijn mening als je zeker weet dat je nooit (door die verbinding) een andere database gaat aanspreken dan MySQL. Zelf vind ik PDO wel fijner, omdat die net wat uitgebreider is (en PDOExceptions erg fijn zijn om af te handelen).

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

Mysqli is helemaal niet achterhaald, en zeker niet door PDO. PDO bestond al vóór mysqli in PHP zat. ;) Het zijn gewoon twee verschillende beestjes met twee verschillende doelen.
RobertMe schreef op dinsdag 14 januari 2014 @ 18:34:
[...]

PHP:
1
2
//de schrijfwijze van RobIII is daarbij nog iets beter/'veiliger', en zou samengevoegd dit zijn
if(($result = $mysqli->query($controle)) !== false)
In dit geval zou ik dat niet doen. Zonder die !== false zijn er namelijk nog een aantal andere waarden waar de mysqli-functies geen raad mee weten die je ook alvast afdicht. Die zouden nooit gereturnd mogen worden maar we hebben het natuurlijk wel over PHP. :P

[ Voor 60% gewijzigd door NMe op 14-01-2014 21:02 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
NMe schreef op dinsdag 14 januari 2014 @ 20:57:

In dit geval zou ik dat niet doen. Zonder die !== false zijn er namelijk nog een aantal andere waarden waar de mysqli-functies geen raad mee weten die je ook alvast afdicht. Die zouden nooit gereturnd mogen worden maar we hebben het natuurlijk wel over PHP. :P
* RobIII ging uit van de documentatie. My bad, should've known :+

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

RobIII schreef op dinsdag 14 januari 2014 @ 21:43:
[...]

* RobIII ging uit van de documentatie. My bad, should've known :+
Mja, ik ben in dit geval paranoïde. :P

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • ObiTewodros
  • Registratie: April 2011
  • Laatst online: 05-04 22:22
Waarom toekenning $result niet gewoon weglaten? Is toch overbodig.

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

Hoe wou je precies zonder resultset een fetch op je data doen? :?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Sgreehder
  • Registratie: Juni 2004
  • Laatst online: 20-10 20:31
PHP:
1
2
3
<?php 
// != is genoeg, en dicht bijv. 0 en null ook af (handig als je wordt gedwongen met een db extensie te werken die het anders doet)
while(($result = $mysqli->query($controle)) != false) { }


Toch zou ik het (assignment in condition) zoveel mogelijk vermijden, zeker in sommige gevallen kan het tot nare foutjes leiden:

PHP:
1
2
3
4
5
<?php
$i++;
while ($i = 1) {
    $i++;
}

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

Diezelfde fout kun je óók maken als je die constructies vermijdt. Bovendien zal een goede IDE er een waarschuwing voor tonen als je een assignment doet in een condition, dus dan kun je makkelijk beoordelen of dat inderdaad de bedoeling was of niet.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.

Pagina: 1