[PHP] Twee keer dezelfde code runnen voorkomen.

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
Een bekend probleem in mijn code (vereenvoudigd voorbeeld):
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
function get_title($id)
{
  $result = db_query("SELECT title FROM nodes WHERE id = %d", $id);
  if (db_num_rows($result) != 1) return false;
  else return db_result($result, 0);
}


if (get_title($_GET['id']))
{
  $title = get_title($_GET['id']);
}

Met andere woorden: ik run eerst get_title() om te kijken of deze iets terug geeft en als dat zo is, run ik hem nog een keer om het resultaat in $title te stoppen. Hoe is deze code om te schrijven, zodat ik get_title maar 1 keer hoef te runnen? Ik heb wel een idee, maar dit lijkt me niet erg netjes:
PHP:
1
2
3
4
5
$test = get_title($id);
if ($test != false)
{
  $title = $test;
}

[ Voor 14% gewijzigd door Reveller op 02-11-2004 16:41 ]

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


Acties:
  • 0 Henk 'm!

  • BoAC
  • Registratie: Februari 2003
  • Laatst online: 20-09 23:24

BoAC

Memento mori

Een reference ($title) meegeven aan get_title ;)

Voorbeeld:
PHP:
1
2
3
4
5
function get_title($id, &$title)
{
  $title="xxx"; // of $title niet toekennen
  return true;  // of false;
}


Je schoont $result niet..

/offtopic: Wie heeft nu de mooiste oplossing? :D

[ Voor 65% gewijzigd door BoAC op 02-11-2004 16:44 ]


Acties:
  • 0 Henk 'm!

  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08
PHP:
1
if (false !== ($title = get_title ($_GET['id'])))

Of in get_title met static vars gaan werken. Zoiets:
PHP:
1
2
3
4
5
6
7
8
9
10
11
function get_title ($id)
{
     static $ret;
     if (!isSet ($ret))
     {
          $result = db_query("SELECT title FROM nodes WHERE id = %d", $id);
          if (db_num_rows ($result) != 1) $ret = '';
          else $ret = db_result ($result, 0);
     }
     return $ret;
}

[ Voor 68% gewijzigd door PrisonerOfPain op 02-11-2004 16:51 ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Je hoeft hem toch al maar 1x te runnen?
PHP:
1
if (($title = get_title($_GET['id'])) !== false)

Jeej, spuit elf. :P

[ Voor 19% gewijzigd door NMe op 02-11-2004 16:41 ]

'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.


Acties:
  • 0 Henk 'm!

  • Salandur
  • Registratie: Mei 2003
  • Laatst online: 14:41

Salandur

Software Engineer

waarom niet gewoon met null werken?
PHP:
1
2
3
4
5
6
7
8
9
10
11
function get_title($id) { 
  $result = db_query("SELECT title FROM nodes WHERE id = %d", $id); 
  if (db_num_rows($result) != 1) return null; 
  else return db_result($result, 0); 
} 

$title = get_title($_GET['id']); 

if ($title != null) {
   .....
}



je kan ook een lege string retourneren:
PHP:
1
2
3
4
5
6
7
function get_title($id) { 
  $result = db_query("SELECT title FROM nodes WHERE id = %d", $id); 
  if (db_num_rows($result) != 1) return ""; 
  else return db_result($result, 0); 
} 

$title = get_title($_GET['id']);

In dit geval kan je hem gewoon afdrukken.

Wat wil je eigenlijk met $title doen?

offtopic:
de mooiste hangt maar net af wat de TS met de $title wil doen :)

edit:
code -> php

[ Voor 15% gewijzigd door Salandur op 02-11-2004 16:48 ]

Assumptions are the mother of all fuck ups | iRacing Profiel


Acties:
  • 0 Henk 'm!

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
Het volgende werkt bij mij:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
function get_title($id, &$title)
{
  $result = db_query("SELECT title FROM nodes WHERE nid = %d", $id);
  $title  = db_result($result, 0);
  return true;  // of false;
}



if (get_title(97, $title))
{
  echo $title;
}

Ik weet nu dat & een "reference" heet, maar kan iemand mij uitleggen wat het nu precies doet? Met andere woorden: "wat is een reference"?

@salandur - dit is een vereenvoudigd voorbeeld; het gaat om het principe. Maar je zou kunnen zeggen dat ik $title wil gebruiken om hem in een template te plaatsen, om de plek van de {title} token...mooiste oplossing kies ik nog, ik wil ze eerst allemaal begrijpen ;)

[ Voor 28% gewijzigd door Reveller op 02-11-2004 16:52 ]

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


Acties:
  • 0 Henk 'm!

  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08

Acties:
  • 0 Henk 'm!

  • Salandur
  • Registratie: Mei 2003
  • Laatst online: 14:41

Salandur

Software Engineer

Reveller schreef op 02 november 2004 @ 16:51:
Ik weet nu dat & een "reference" heet, maar kan iemand mij uitleggen wat het nu precies doet? Met andere woorden: "wat is een reference"?
normaal geef je de waarde van een variabele door. dus
PHP:
1
2
$id = 1;
getTitle($id);

levert binnen getTitle() alleen maar 1 op. als deze wordt gewijzigd gebeurdt er met $id niks

Bij een reference wordt het geheugen adres doorgeveven. In dat geval levert een wijziging binnen getTitle() ook een wijziging van $id op.
Reveller schreef op 02 november 2004 @ 16:51:
@salandur - dit is een vereenvoudigd voorbeeld; het gaat om het principe. Maar je zou kunnen zeggen dat ik $title wil gebruiken om hem in een template te plaatsen, om de plek van de {title} token...mooiste oplossing kies ik nog, ik wil ze eerst allemaal begrijpen ;)
Dan gewoon null of een lege string terug geven. Als de waarde null/lege string is dan eventueel niet doorgeven naar de template, afhangelijk van het soort template systeem dat je gebruik. Of een default title instellen:
PHP:
1
if ($title == null) $title = "Standaard titel";

Suc6

[ Voor 39% gewijzigd door Salandur op 02-11-2004 16:56 ]

Assumptions are the mother of all fuck ups | iRacing Profiel


Acties:
  • 0 Henk 'm!

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
Had ik natuurlijk eerst al gezocht, maar het brengt mij weinig verder en geeft al helemaal geen antwoord op de vraag waarom de functie nu maar eenmalig uitgevoerd hoeft te worden...

"References can be thought of as hardlinking in Unix filesystem" :?

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


Acties:
  • 0 Henk 'm!

  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08
Reveller schreef op 02 november 2004 @ 16:54:
[...]


Had ik natuurlijk eerst al gezocht, maar het brengt mij weinig verder en geeft al helemaal geen antwoord op de vraag waarom de functie nu maar eenmalig uitgevoerd hoeft te worden...

"References can be thought of as hardlinking in Unix filesystem" :?
Hardlinks wijzen allebij naar dezelfde locatie in het geheugen (hardeschijf) maar zijn twee verschillende stukjes in de inode tabel (vergelijk met variabelen). In dit geval word de variabele $title aan de functie meegegeven, die de functie zelf vult. Het functie argument $title en de gewone variabele $title wijzen dus naar hetzelfde geheugen stukje. Het is niet zo dat het argument $title (normale variabele) naar de parameter $title wijst, wat in C het geval is.

Ff vette ASCII art:
C:
code:
1
title -> title2 -> "blaat"

PHP:
code:
1
2
3
title  \
        ----> "blaat"
title2 /

[ Voor 9% gewijzigd door PrisonerOfPain op 02-11-2004 17:03 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Reveller schreef op 02 november 2004 @ 16:51:
Ik weet nu dat & een "reference" heet, maar kan iemand mij uitleggen wat het nu precies doet? Met andere woorden: "wat is een reference"?
aka pointer
Pagina: 1