SELECT FROM syntax
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)
1
2
3
4
5
6
7
8
9
10
11
12
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);
?>
// 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.
Probeer het eens als volgt:
Code (php)
1
$sql = mysql_query('SELECT * FROM '.$table.' WHERE datum BETWEEN "'.$FTGdatum1.'" AND "'.$FTGdatum2.'"');
Gewijzigd op 06/03/2015 12:03:29 door Pipo Clown
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."'"
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
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;
?>
// 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)
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
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;
?>
// 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
Code (php)
1
2
3
2
3
<?php
$sql = mysql_query("SELECT * FROM " . $table . " WHERE datum BETWEEN '" . $FTGdatum1 . "' AND '" . $FTGdatum2 . "'");
?>
$sql = mysql_query("SELECT * FROM " . $table . " WHERE datum BETWEEN '" . $FTGdatum1 . "' AND '" . $FTGdatum2 . "'");
?>
Oops dacht even niet na :p Bedankt voor de correctie :)
Volgens mij staat er nu exact wat er in de eerste reactie in dit topic werd aangegeven.
Pipo, Nee. Kijk nog even een keer zorgvuldig!
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.
Mogelijk heb je nu output in je script zitten (regel 22 laatste code fragment) en krijg je een "headers already sent" error.
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?
Als je query geen stukken tekst bevat: enkele of dubbele quotes, maakt niet uit.
Code (php)
1
2
3
4
5
2
3
4
5
<?php
$query = "SELECT * FROM whatever WHERE id = 12";
// of
$query = 'SELECT * FROM whatever WHERE id = 12';
?>
$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)
1
2
3
4
5
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";
?>
$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)
1
2
3
4
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
?>
$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)
1
2
3
2
3
<?php
$query = "SELECT * FROM whatever WHERE id = '".mysqli_real_escape_string($link, $id)."'";
?>
$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.
Merk op dat het met tekst geen luie oplossing is om *_real_escape_string te gebruiken.
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.
Het begint een beetje te dagen ;-)
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.
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
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';
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.
Ja, hij converteert de waarde wel, maar gebruikt 'ie dan ook nog de index?
Vervolgens staat er dus WHERE employee_id = 200
dus dan lijkt me daar niets aan de hand