[MYSQL] Row met bepaalde waarde

Pagina: 1
Acties:

  • DiLDoG
  • Registratie: Oktober 2002
  • Laatst online: 15-04 11:31
Ik ben bezig met een script dat een row met een bepaalde naam uit een tabel selecteerd. Als deze niet bestaat moet een default row nemen.

Nu doe ik dat zo:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
// Get current menu from request variables
if ($s = mysql_escape_string(array_shift($vars)));
{
    $result = mysql_query("SELECT `id`, `name`, `title` FROM `menu` WHERE `name` = '{$s}'", $this->db);
    $this->menu = mysql_fetch_assoc($result);
    mysql_free_result($result);
}
if (empty($this->menu))
{
    $result = mysql_query("SELECT `id`, `name`, `title` FROM `menu` ORDER BY `order` ASC LIMIT 0,1", $this->db);
    $this->menu = mysql_fetch_assoc($result);
    mysql_free_result($result);
}



Is het niet mogenlijk om dit in één statement te doen? iets in de zin van:

SELECT * FROM `menu` ORDER BY (`name` = '$var'), `order` ASC LIMIT 0,1


in de manual staat wel [ORDER BY {col_name | expr | position} ... ] maar ik weet niet precies wat ze daar mee bedoelen.


edit: mijn excuses voor de semi vergeten topic naam :X

[ Voor 8% gewijzigd door DiLDoG op 19-07-2005 16:36 ]


  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 01-05 19:54

Bosmonster

*zucht*

Nee, want je wil twee verschillende dingen in de queries. Sowieso is dit het meest efficient (al had ik het iets anders uitgewerkt), aangezien je zo de tweede query nooit hoeft uit te voeren als die eerste wel wat oplevert.

Beide queries zijn daarbij zo simpel dat op een tabel met juiste indexen de uitvoertijd bijna verwaarloosbaar is.

  • DiLDoG
  • Registratie: Oktober 2002
  • Laatst online: 15-04 11:31
Ik heb het zelf al uitgevonden, misschien had ik net wat langer zelf moeten kloten voor ik een topic opende, maarja misschien heeft iemand hier nog wat aan. Ik heb het dus zo opgelost

PHP:
1
2
3
4
5
// Get current menu from request variables
$s = mysql_escape_string(array_shift($vars));
$result = mysql_query("SELECT `id`, `name`, `title` FROM `menu` ORDER BY (`name` = '$s') DESC, `order` ASC LIMIT 0,1", $this->db);
$this->menu = mysql_fetch_assoc($result);
mysql_free_result($result);


De snelheidswinst is verwaarsloosbaar op zon kleine tabel, maar ik vond het een stukje overzichtelijker zo, en ik heb er weer wat van geleerd.

en omdat ik me verveelde:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    function f1()
{
    $s = "organisatie";
    $result = mysql_query("SELECT `id`, `name`, `title` FROM `menu` WHERE `name` = '{$s}'", $this->db);
    $this->menu = mysql_fetch_assoc($result);
    mysql_free_result($result);
}

function f2()
{
    $s = "organisatie";
    $result = mysql_query("SELECT `id`, `name`, `title` FROM `menu` ORDER BY (`name` = '$s') DESC, `order` ASC LIMIT 0,1", $this->db);
    $this->menu = mysql_fetch_assoc($result);
    mysql_free_result($result);
}


500x f1() : 0,17847s
500x f2() : 0,12898s

Dus het is wel degelijk sneller :) (zeker als je daarna nog die 2de query zou moeten uitvoeren)

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
Als je een bench doet, zorg dan tenminste dat (één van) het resultaat rond de 5-10 seconden zit. Dan kun je pas echt betrouwbaar meten. In je eerste stuk code is de conditie in het if statement toch altijd true? mysql_escape_string() (je moet mysql_real_escape_string() gebruiken trouwens) returned nooit false dacht ik.

Noushka's Magnificent Dream | Unity


  • DiLDoG
  • Registratie: Oktober 2002
  • Laatst online: 15-04 11:31
Bedankt voor dat real escape gebeuren. 'This function is deprecated.' :Y)

PHP:
1
2
3
4
5
6
7
if ( mysql_real_escape_string(NULL, $this->db) )
{
    echo "TRUE";
}
else {
    echo "FALSE";
}


resulteerd trouwens in FALSE. Moest ook wel want die if statement werkte wel gewoon :)

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
Omdat het null returned waarschijnlijk en dat wordt als false gezien. Maar ik zou het zeker niet zo gebruiken. Het is niet gedocumenteerd, het is onduidelijk wanneer het nu false is en je intentie is er zo niet uit te ontdekken. Ik zou eerst de waarde zelf controleren en op basis daarvan dan een pad kiezen en pas op het moment dat er echt ge-escaped hoeft te worden (en het ook zin heeft) ook echt escapen en niet eerder. Meer iets als:
PHP:
1
2
3
4
5
6
7
8
9
10
11
$testVar = null; // deze komt dus ergens anders vandaan normaal
$isValid = $testVar != null;
if ( $isValid )
{
  $safeTestVar = mysql_real_escape_string($testVar);
  // voer een query uit met $safeTestVar
}
else
{
  // doe iets anders
}

Ik denk persoonlijk dat dit gemakkelijker te lezen is (ook voor jezelf over een jaar) dan om mysql_real_escape_string() direct in het if statement te gebruiken. En een streven naar leesbaardere code is een erg belangrijke imo.

Noushka's Magnificent Dream | Unity


  • DiLDoG
  • Registratie: Oktober 2002
  • Laatst online: 15-04 11:31
Ja, daarom gebruik ik nu dus deze methode:

PHP:
1
2
3
4
5
// Get current menu from request variables
$s = mysql_escape_string(array_shift($vars));
$result = mysql_query("SELECT `id`, `name`, `title` FROM `menu` ORDER BY (`name` = '$s') DESC, `order` ASC LIMIT 0,1", $this->db);
$this->menu = mysql_fetch_assoc($result);
mysql_free_result($result);
Pagina: 1