SELECT FROM syntax

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: 1 2 3 volgende »

Ignace Verschaeve

Ignace Verschaeve

06/03/2015 11:46:47
Quote Anchor link
Ik zit in de knoop(voor de zoveelste keer).
Ik heb een PHP script om een csv file te exporteren uit mij Mysql database. Zover gat het goed, maar nu wil ik de geexporteerde gegevens beperken tot een bepaalde datum. Dus een HTML formulier waar begin en einddatum wordt gekozen en dan verzonden ter uitvoering van het script. En daar loopt het fout. Ik vermoed dat het in mijn Select query zit. Hier volgt het stukje script
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
<?PHP
// input ophalen
$FTGdatum1 = DoStripSlashes( $_POST['begindatum'] );
$FTGdatum2 = DoStripSlashes( $_POST['einddatum'] );
    
// Fetch Record from Database

$output            = "";
$table             = "eva_tevr";
$sql             = mysql_query("select * from $table WHERE datum BETWEEN $FTGdatum1 AND $FTGdatum2");
$columns_total     = mysql_num_fields($sql);
?>

Het script werkte goed tot ik //input ophalen erbij heb gevoegd en "Where...." heb toegevoegd en ik vermoed dat ik daar de mist inga. Het is ook de bedoeling dat ik ook maar bepaalde velden exporteer maar dat moet ik het * vervangen door de veldnamen.
 
PHP hulp

PHP hulp

23/04/2024 15:03:32
 
Pipo Clown

Pipo Clown

06/03/2015 12:02:48
Quote Anchor link
Ik weet zo niet uit mijn hoofd of je de BETWEEN goed gebruikt maar ik weet wel dat je de variabelen uit de string moet halen.
Probeer het eens als volgt:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$sql             = mysql_query('SELECT * FROM '.$table.' WHERE datum BETWEEN "'.$FTGdatum1.'" AND "'.$FTGdatum2.'"');
Gewijzigd op 06/03/2015 12:03:29 door Pipo Clown
 
Mathieu Posthumus

Mathieu Posthumus

06/03/2015 12:26:44
Quote Anchor link
Wat je fout had gedaan was:

bij de variablen in de query had je dit gedaan:
Fout: "SELECT * FROM $table WHERE datum BETWEEN $FTGdatum1 AND $FGTdatum2"
Goed: "SELECT * FROM '".$table."' WHERE datum BETWEEN '".$FTGdatum1."' AND '".$FTGdatum2."'"
 
Ignace Verschaeve

Ignace Verschaeve

06/03/2015 12:46:24
Quote Anchor link
dit is de oorspronkelijke code die wel degelijk werkt.
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
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
<?php

// Database Connection

$host="x";
$uname="xxx";
$pass="xxxx";
$database = "xxxx";    

$connection=mysql_connect($host,$uname,$pass);

echo mysql_error();

//or die("Database Connection Failed");
$selectdb=mysql_select_db($database) or die("Database could not be selected");    
$result=mysql_select_db($database)
or die("database cannot be selected <br>");

    
// Fetch Record from Database

$output            = "";
$table             = "eva_tevr"; // Enter Your Table Name
$sql             = mysql_query("select * from $table");
$columns_total     = mysql_num_fields($sql);

// Get The Field Name

for ($i = 0; $i < $columns_total; $i++) {
    $heading    =    mysql_field_name($sql, $i);
    $output        .= '"'.$heading.'";';
}

$output .="\n";

// Get Records from the table

while ($row = mysql_fetch_array($sql)) {
for ($i = 0; $i < $columns_total; $i++) {
$output .='"'.$row["$i"].'";';
}

$output .="\n";
}


// Download the file

$filename =  "myFile.csv";
header('Content-type: application/csv');
header('Content-Disposition: attachment; filename='.$filename);

echo $output;
exit;
    
?>


Dat wilde ik dus aanpassen door een klein formulier te maken waarbij ze begindatum en einddatum via een datepicker kunnen aanduiden.

Na jullie goede raad is het nu dit: (ik heb er wel een echo tussengezet om de datums te zien.)

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
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
<?php

// Database Connection

$host="xxxxx";
$uname="xxxxx";
$pass="xxxx";
$database = "xxxx";    

$connection=mysql_connect($host,$uname,$pass);

echo mysql_error();

//or die("Database Connection Failed");
$selectdb=mysql_select_db($database) or die("Database could not be selected");    
$result=mysql_select_db($database)
or die("database cannot be selected <br>");

// input ophalen
$FTGdatum1 =( $_POST['begindatum'] );
$FTGdatum2 =( $_POST['einddatum'] );
    echo .$FTGdatum1. "-" .$FTGdatum2.;
// Fetch Record from Database

$output            = "";
$table             = "eva_tevr";
$sql             = mysql_query("SELECT * FROM '".$table."' WHERE datum BETWEEN '".$FTGdatum1."' AND '".$FTGdatum2."'");
$columns_total     = mysql_num_fields($sql);

// Get The Field Name

for ($i = 0; $i < $columns_total; $i++) {
    $heading    =    mysql_field_name($sql, $i);
    $output        .= '"'.$heading.'";';
}

$output .="\n";

// Get Records from the table

while ($row = mysql_fetch_array($sql)) {
for ($i = 0; $i < $columns_total; $i++) {
$output .='"'.$row["$i"].'";';
}

$output .="\n";
}


// Download the file

$filename =  "myFile.csv";
header('Content-type: application/csv');
header('Content-Disposition: attachment; filename='.$filename);

echo $output;
exit;
    
?>


Maar het wil niet werken
 
Pipo Clown

Pipo Clown

06/03/2015 12:54:01
Quote Anchor link
De tabelnaam hoeven geen quotes om heen :


Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$sql             = mysql_query("SELECT * FROM ".$table." WHERE datum BETWEEN '".$FTGdatum1."' AND '".$FTGdatum2."'");
 
Ward van der Put
Moderator

Ward van der Put

06/03/2015 12:54:25
Quote Anchor link
De datums moeten in '...' maar de tabelnaam niet.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$sql
= mysql_query("SELECT * FROM " . $table . " WHERE datum BETWEEN '" . $FTGdatum1 . "' AND '" . $FTGdatum2 . "'");
?>
 
Mathieu Posthumus

Mathieu Posthumus

06/03/2015 13:04:34
Quote Anchor link
Oops dacht even niet na :p Bedankt voor de correctie :)
 
Pipo Clown

Pipo Clown

06/03/2015 13:47:21
Quote Anchor link
Volgens mij staat er nu exact wat er in de eerste reactie in dit topic werd aangegeven.
 
Mathieu Posthumus

Mathieu Posthumus

06/03/2015 13:52:28
Quote Anchor link
Pipo, Nee. Kijk nog even een keer zorgvuldig!
 
Ignace Verschaeve

Ignace Verschaeve

07/03/2015 08:34:07
Quote Anchor link
Ik zit met een heel eigenaardig fenomeen. Van zodra ik ook maar iets verander aan het script werkt het niet meer. Ik heb die aanpassingen gedaan zoals jullie voorstellen. Dus de data input en de Select regel en ik krijg nu de gevraagde data op het scherm maar niet aangeboden als csv file om te downloaden,zoals voorheen. Ik kan dit uiteraard ook doen via PHP admin maar het is de bedoeling dat de gebruiker simpelweg de juiste data kan bekomen met enkele simpele handelingen en niet rechtstreeks in de database kan zitten knoeien.
 
Thomas van den Heuvel

Thomas van den Heuvel

07/03/2015 13:55:16
Quote Anchor link
Zet foutmeldingen aan.

Mogelijk heb je nu output in je script zitten (regel 22 laatste code fragment) en krijg je een "headers already sent" error.
 
Ignace Verschaeve

Ignace Verschaeve

08/03/2015 19:47:42
Quote Anchor link
Ik snap nog altijd de syntax met die enkele, dubbele quotes en de puntjes niet.
Input komt uit een formulier.
Het select statement begrijp ik
("select * from $table" en dat werkt
maar als ik er where achteraan zet met datum BETWEEN '" . $FTGdatum1 . "' enzovoort
Dan moet dit plots met een enkel qoute, een dubbele qoute, een puntje en de inhoud van het formulierveld terug een puntje,dubbele quote, enkele quote.
$FTGdatum1 is het resultaat van $FTGdatum1 =( $_POST['begindatum'] )
Ik heb al uren gezocht maar ik vind nergens een deftige uitleg over hoe de correcte syntax is in PHP code van het "select from where" statement en de verschillende mogelijkheden zoals in dit geval formulier input maar er zijn nog andere mogelijkheden.
Iemand die mij iets kan aanbevelen?
 
Thomas van den Heuvel

Thomas van den Heuvel

08/03/2015 20:02:21
Quote Anchor link
Als je query stukken tekst bevat: zet dubbele quotes om de query en enkele quotes om de tekst.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$query
= "SELECT * FROM whatever WHERE tekst = 'tekst'";
?>

Als je query geen stukken tekst bevat: enkele of dubbele quotes, maakt niet uit.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
$query
= "SELECT * FROM whatever WHERE id = 12";
// of
$query = 'SELECT * FROM whatever WHERE id = 12';
?>

Als je query variabelen bevat: je kunt dan je query-string onderbreken met het gebruikte quote-type, je variabele afdrukken, en dan je query-string weer voortzetten met het gebruikte quote-type.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
$query
= 'SELECT * FROM whatever WHERE id = '.$id.' AND something = 5';
// of
$query = "SELECT * FROM whatever WHERE id = ".$id." AND something = 5";
?>

OF
Als je variabelen in je query wilt zetten: gebruik dubbele quotes om je query-string, want een string tussen enkele quotes verwerkt geen variabelen.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
$query
= 'SELECT * FROM whatever WHERE id = $id'; // werkt niet (drukt letterlijk "id = $id" af)
$query = "SELECT * FROM whatever WHERE id = $id"; // werkt wel
?>


Dit alles staat los van het "escapen" van data-van-buitenaf om je query te beveiligen tegen SQL-injecties. Sommige mensen lossen dit op door middel van het zetten van quotes om alle variabelen en vervolgens het toepassen van een _real_escape_string functie:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$query
= "SELECT * FROM whatever WHERE id = '".mysqli_real_escape_string($link, $id)."'";
?>

Maar dat is een luie/verkeerde oplossing, omdat id mogelijk helemaal geen getal bevat. In sommige gevallen is het beter om invoer te filteren. En als $id dan geen getal blijkt te bevatten de query dan helemaal niet uit te voeren.
 
Wouter J

Wouter J

08/03/2015 22:11:17
Quote Anchor link
Merk op dat het met tekst geen luie oplossing is om *_real_escape_string te gebruiken.
 
Thomas van den Heuvel

Thomas van den Heuvel

08/03/2015 22:14:00
Quote Anchor link
Het "lui"-deel ging meer over het quotes eromheen zetten.

Ik gebruik de volgende strategie: ik zet overal _real_escape_string() omheen, vanwege veiligheid maar ook om een onderdeel als DATA te markeren. Ik gebruik echter geen quotes om numerieke waarden, daartoe controleer ik vantevoren of ik van doen heb met een numerieke waarde, en anders voer ik de query gewoon niet uit.
 
Ignace Verschaeve

Ignace Verschaeve

09/03/2015 08:37:44
Quote Anchor link
Het begint een beetje te dagen ;-)
 
Ivo P

Ivo P

09/03/2015 09:12:06
Quote Anchor link
@Thomas:

Het vervelende van de promotie: "er horen geen quotes om numerieke waarden" is, dat als iemand geen of een slechte controle doet op het numeriek zijn van de invoer, de query alsnog lek is.

Bedenk dat het stuk "om getallen geen quotes" een heel stuk gemakkelijker is door te voeren (en te onthouden) dan "controleer of het formaat van een waarde lijkt op wat je verwacht".

De vraag is, of je het nutteloos uitvoeren van een query / het uitvoeren van een query met WHERE id='0', opweegt tegen een potentieel lek in je applicatie.

En dan heb ik het niet over de programmeur met jaren ervaring, maar over de beginners die hier op Phphulp om de oren geslagen worden met "geen quotes om getallen" en eigenlijk al een probleem hebben om überhaupt een werkende query uit php te persen.
 
Willem vp

Willem vp

09/03/2015 11:43:09
Quote Anchor link
@Ivo:

Voor zover ik weet, staat in de SQL-standaard niet beschreven dat getallen met quotes mogen worden geschreven. Om beginners iets aan te leren wat buiten de standaard valt, vind ik een slecht uitgangspunt. Leer eerst maar hoe het hoort; als je eenmaal weet hoe het moet, is het minder erg om er bewust van af te wijken, want je weet dan wat de consequenties zijn.

Bovendien is het schijnveiligheid om te denken dat je niet meer vatbaar bent voor SQL-injectie als je numerieke waardes in quotes zet. Je query is dan nog net zo lek. De enige manier om je daar tegen in te dekken, is het controleren van je input en het gebruiken van prepared queries.

Er zit nog een ander nadeel aan het quoten van integers: je loopt namelijk het risico dat de server geen indices gebruikt op dat veld. Bij MySQL gaat het toevallig goed als je een integer-veld vergelijkt met een string (andersom gaat het wel mis) maar er zijn DBMS'en (ik dacht o.a. Oracle) die de index negeren.

Wat mij betreft moet je met beginners niet al teveel medelijden hebben. Leren programmeren is nu eenmaal moeilijk. Daarom moet je met de basis beginnen en niet meteen alles tegelijk willen. Leren zwemmen doe je ook eerst in het ondiepe. Het aanraden om quotes om numerieke waardes te zetten is vergelijkbaar met iemand in het diepe gooien met een lek zwembandje om zijn middel. In het begin blijft 'ie wel drijven, maar na verloop van tijd verdrinkt hij.
Gewijzigd op 09/03/2015 11:44:28 door Willem vp
 
Ivo P

Ivo P

09/03/2015 12:03:17
Quote Anchor link
oracle net niet:
Quote:
Character and Number Values
Example When a condition compares a character value and a NUMBER value, Oracle implicitly converts the character value to a NUMBER value, rather than converting the NUMBER value to a character value. In the following statement, Oracle implicitly converts '200' to 200:

SELECT last_name
FROM employees
WHERE employee_id = '200';


ik snap je punt wel, maar vind er het jammer dat mensen niet eerst in het peuterbadje mogen spetteren.
 
Willem vp

Willem vp

09/03/2015 12:23:42
Quote Anchor link
> oracle net niet:

Ja, hij converteert de waarde wel, maar gebruikt 'ie dan ook nog de index?
 
Ivo P

Ivo P

09/03/2015 13:15:18
Quote Anchor link
hij converteert '200' naar 200.

Vervolgens staat er dus WHERE employee_id = 200

dus dan lijkt me daar niets aan de hand
 

Pagina: 1 2 3 volgende »



Overzicht Reageren

 
 

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.