Smart SQL Queries

Door Arend a, 18 jaar geleden, 4.621x bekeken

Deze drie functies bieden PDO-achtige escape opties voor mensen zonder PDO. Ik raad eenieder die daar de mogelijkheid toe heeft van harte aan om deze functies enkel en alleen te gebruiken wanneer PDO geen optie is, of als backwards compatiblity optie voor bepaalde scripts. Dit script is opzichzelf niet bruikbaar, maar als libary tool erg handig. Dit script bied ondersteuning voor mysql en postgresql. Andere drivers zijn simpel toe te voegen in de functie getSmartCommand

Voor meer informatie over pdo verwijs ik graag door naar de uitstekende tutorial van Blanche: http://www.phphulp.nl/php/tutorials/8/534/

Inleiding
Om het escapen van queries sneller te maken heb ik een algemene tool voor sql queries geschreven. De functie escapeQuery kan gebruikt worden om snel data geescaped in de database te zetten en heeft als doel leesbare en overzichtelijke sql queries in je code op te nemen.

escapeQuery()
Argumenten
$dbh (resource) OPTIONAL Een database resource (mysql of postgresql). Als alternatief wordt $GLOBAL['dbh'] genomen
$query (string) een SQL query waarbij de waarden die SQL geescaped moeten worden met een ? worden aangegeven
$waarden (array)
of
$waarde1,$waarde2,$waarde3 ... (string, integer)

Returns:

Een geescapte sql query.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?
$dbh
= mysql_connect('localhost', "test", "test");
mysql_select_db("testdb",$dbh);
// dit kan ook
// $dbh = pg_connect("host=localhost dbname=testdb user=test password=test");
// zijn, en smartquery zal automagisch herkennen dat het om postgresql gaat. Is dat niet cool?


$query = "
INSERT INTO cms
(title, content, user_id)
VALUES
(?,?,?)
"
;

$title = "Joop's website";
$content = "Een hoop geblaat";
$user_id = 10;

$query = escapeQuery($query, $title, $content, $user_id);
print $query;
?>


Resultaat:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
INSERT INTO cms
(title, content, user_id)
VALUES
('Joop\'s website','Een hoop geblaat',10)


Ook is als tweede argument een array mogelijk en zal het zelfde resultaat geven:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?php
$title
= "Joop's website";
$content = "Een hoop geblaat";
$user_id = 10;

$waarden = array("Joop's website", "Een hoop geblaat", 10);
$query = escapeQuery($query, $waarden);
print $query;
?>


smartQuery()
Als programmeur ben je nog wel eens lui. Ik heb in dit geval een functie geschreven die snel teruggeeft wat ik wil zonder te veel gedoe.

smartQuery handelt sql queries af en geeft afhankelijk van de query andere informatie terug.

Argumenten
$dbh (resource) OPTIONAL Een database resource. Als alternatief wordt $GLOBAL['dbh'] genomen
$query (string) een SQL query waarbij de waarden die SQL geescaped moeten worden met een ? worden aangegeven
$waarden (array)
of
$waarde1,$waarde2,$waarde3 ... (string, integer)

Returns:
In geval van een SELECT query:
een lijst (non-associative array) met resultaten. Deze is direct bruikbaar voor bijvoorbeeld smarty.



Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
$result
= smartQuery("SELECT id, title, content FROM cms");
print_r($result);
?>


Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Array
(
    [0] => Array
        (
            [id] => 1
            [title] => Joop's website
            [content] => Een hoop geblaat
        )

    [1] => Array
        (
            [id] => 2
            [title] => Joop's website
            [content] => Een hoop geblaat
        )
)



In geval van een DELETE of UPDATE query:
Het aantal geupdate of gedelete records.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php
// $dbh is gedefinieerd als je mysql connection resource
$query = "
UPDATE cms
set user_id = ?
"
;

$result = smartQuery($dbh,$query,2);
print "Updated records: " . $result;
?>


returns
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
Updated records: 6


In geval van een INSERT query:
Het id van de geinserte record.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
$query
= "
INSERT INTO cms
(title, content, user_id)
VALUES
(?,?,?)
"
;

$title = "Joop's website";
$content = "Een hoop geblaat";
$user_id = 10;

$result = smartQuery($query, $title, $content, $user_id);
print "Inserted id: " . $result;
?>


returns
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
5


Noot: dit script is compatible met mysql en postgresql queries. Meerdere connecties (ook van verschillende types) tegelijkertijd is niet getest, en zal waarschijnlijk niet de verwachtte resultaten opleveren.

Gesponsorde koppelingen

PHP script bestanden

  1. smart-sql-queries

 

Er zijn 10 reacties op 'Smart sql queries'

PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Joren de Wit
Joren de Wit
18 jaar geleden
 
0 +1 -0 -1
Ziet er veelbelovend uit Arend, voor zover ik het zonder tags goed heb kunnen lezen. Die moet je nog even toevoegen :-)

Verder zag ik wel dat je in smartQuery() twee global variabelen gebruikt, je verlangt dus van de gebruiker dat hij ook $dbh en $debug in zijn scripts gebruikt. Ik zou er liever voor kiezen om deze variabelen ook als parameters aan de functie mee te geven. $debug zou je dan weg kunnen laten, aangezien je deze nergens in je functie gebruikt.
W W
W W
18 jaar geleden
 
0 +1 -0 -1
Schoonheids foutje?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?php
$title
= "Joop's website";
$content = "Een hoop geblaat";
$user_id = 10;

$waarden = array("Joop's website", "Een hoop geblaat", 10);
$query = escapeQuery($query, $waarden);
print $query;
?>


Moet dit niet het volgende zijn?
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?php
$title
= "Joop's website";
$content = "Een hoop geblaat";
$user_id = 10;

$waarden = array("Joop's website", "Een hoop geblaat", $user_id);
$query = escapeQuery($query, $waarden);
print $query;
?>


Verder zeer goede tut!
Arend a
Arend a
18 jaar geleden
 
0 +1 -0 -1
Jullie hebben helemaal gelijk. Ik heb een paar aanpassingen gemaakt, iets meer voorbeelden en Banche's commentaar verwerkt. Nu is als eerste argument ook een resource id mogelijk, anders wordt de global $dbh gebruikt.
Arend a
Arend a
18 jaar geleden
 
0 +1 -0 -1
En een kleine toevoeging: het script ondersteund nu zowel postgresql als mysql.
Rudie dirkx
rudie dirkx
18 jaar geleden
 
0 +1 -0 -1
Zeer handige functies.
Ik heb voor mezelf een stel functies die ongeveer hetzelfde doen, maar (vind ik) duidelijker. bijvoorbeeld een db_insert(String Table,Array Inserts) functie. Die geeft dus insert_id terug. En de db_update(String Table, (String Updates/Array Updates), String Statement) functie geeft het aantal affected rows terug. Andere functies zijn db_count, db_max, db_select, db_fetch_fields, etc, etc.
Maar het idee is hetzelfde :) Ontzettend handig dus.
Ik houd ervan om de query juist NIET te hoeven schrijven, zoals jij wel doet, daarom heb ik voor elke soort query een eigen functie, jij doet dat met die ene smartQuery().
Je moet er maar van houden
Klaasjan Boven
Klaasjan Boven
18 jaar geleden
 
0 +1 -0 -1
Arend een erg net script. Echter volgens mij 1 onvolkomenheid
mysql_escape_real
moet volgens mij zijn : mysql_real_escape_string op regel 20

Voor de rest erg handig
Hipska BE
Hipska BE
18 jaar geleden
 
0 +1 -0 -1
NULL values moeten niet ge-escaped worden, anders worden ze aanzien als strings...
Arend a
Arend a
18 jaar geleden
 
0 +1 -0 -1
Bedankt voor de tip, die had ik nog niet gezien, ik heb het aangepast dat null values en de string "NULL" niet wordt geescaped.
Rudie dirkx
rudie dirkx
18 jaar geleden
 
0 +1 -0 -1
Arend, wat nu als je de string NULL wil opslaan? Het kan zo maar eens voorkomen he...
Je kan natuurlijk NULL maken van de NULL byte (ja die kent php gelukkig wel). En als je "NULL" de functie ingooit, dan maakt ie er de string 'NULL' van.
Ofwel:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
$arrInsert = array(
  'pk' => null,
  'fk1' => null,
  'fk2' => 4,
  'fetish' => 'NULL',
  'sexy' => '1',
);


Edit:
Is dit niet raar:
function escapeByType ($argument) {
$commands = getSmartCommand($dbh);
Je geeft $dbh als parameter terwijl ie niet bestaat... En het is niet een reference, of je mist een & in je getSmartCommand functie...
PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Arend a
Arend a
18 jaar geleden
 
0 +1 -0 -1
Je hebt gelijk. Ik heb het gefixed

Om te reageren heb je een account nodig en je moet ingelogd zijn.

Inhoudsopgave

  1. smart-sql-queries

Labels

  • Geen tags toegevoegd.

Navigatie

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.