SELECT FROM syntax

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: « vorige 1 2 3 volgende »

Thomas van den Heuvel

Thomas van den Heuvel

09/03/2015 14:05:42
Quote Anchor link
Dit is wat voor mij werkt, wat je zelf doet moet je zelf weten. De regels die ik gebruik zijn op een hand te tellen en zijn ondubbelzinnig. Je hoeft bij gebruik (als je eenmaal hebt doorgrond wat er gebeurt) ook niet al teveel na te denken wat ook fijn is ten opzichte van jezelf continu afvragen 'doe ik het wel goed' tijdens het schrijven van code.

Dat lijkt mij nog altijd beter dan om alles plat te spuiten met een prepared statements laag en daarmee aan te moedigen niet verder na te denken over wat je doet.

Tevens: getallen volgen een andere sortering dan strings. Als je je daar in je queries niet bewust van bent kan dit rare resultaten opleveren.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
mysql> SELECT '200' BETWEEN '1' AND '3';
+---------------------------+
| '200' BETWEEN '1' AND '3' |
+---------------------------+
|                         1 |
+---------------------------+
1 row in set (0.00 sec)


Ik had laatst serieus een programmeur die gebruik maakte van PDO en zich afvroeg waarom een query geen foutmelding opleverde. Deze query vroeg informatie op uit een tabel middels een id uit de URL. In de URL vulde hij echter zoiets in als ?id=aap. In plaats van een foutmelding leverde dit gewoon geen resultaat op (omdat je tussenlaag van alles voor je aanpast). De programmeur begreep niet waarom.

Je zou dan kunnen stellen dat dit soort lagen hun doel voorbij zijn geschoten, maar ook dat zo'n laag alleen niet genoeg is.

Af en toe behoor je je input gewoon te filteren en vaak (nagenoeg altijd) is het verstandig om output te escapen. Dit is bijna fundamenteel voor het schrijven van "veilige code" dus ik snap niet dat dit wordt afgeraden om aan te leren aan beginners omdat dit te geavanceerd zou zijn.

En tot slot: Wat helemaal funest is, is als je eigenlijk geen weet hebt van wtf je aan het doen bent. Op het moment dat je aan de slag gaat met databases dan moet je je vertrouwd gaan maken (of het al zijn) met een aantal onderwerpen.
Gewijzigd op 09/03/2015 14:06:22 door Thomas van den Heuvel
 
PHP hulp

PHP hulp

05/11/2024 10:20:15
 
Willem vp

Willem vp

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

Vervolgens staat er dus WHERE employee_id = 200

dus dan lijkt me daar niets aan de hand

Hieruit blijkt nog steeds niet of het record wordt opgezocht door middel van een index lookup of een full table scan. In extreme gevallen kan dat het verschil zijn tussen het terugkrijgen van het record in een paar milliseconden of een paar minuten.
 
Ignace Verschaeve

Ignace Verschaeve

09/03/2015 20:20:39
Quote Anchor link
heb hier blijkbaar ongewild een discussie losgeweekt. In dit geval gaat het enkel om 2 datums waartussen de selectie moet vallen. Qua veiligheid maak ik mij weinig zorgen omdat dit enkel voor intern gebruik zal zijn. Maar toch zou ik graag weten hoe jullie dit als veilig zouden doen. Ik heb dit:
$FTGbegindatum = ( $_POST['begindatum'] );
$FTGeinddatum = ( $_POST['einddatum'] );
en vervolgens dit:
$sql_query = "select datum,factnr,email,verkoper from $table WHERE datum BETWEEN '". $FTGbegindatum ."' AND '". $FTGeinddatum ."'";
Ik begrijp dat dit niet veilig is.
Dus wil ik graag leren en begrijpen wat wel veilig is.
 
- Ariën  -
Beheerder

- Ariën -

09/03/2015 21:07:20
Quote Anchor link
Ten eerste heeft het weinig nut om variabelen te te kopieëren. Waarom zou je $FTGbegindatum willen gebruiken, terwijl je al $_POST['begindatum'] hebt? Onnodig geheugenverspilling!

Verder moet je $_POST, $_GET en $_COOKIE-variabelen in een query altijd escapen met mysql(i)_real_escape_string() om SQL-injection te voorkomen.

Verder gebruiken we voor de leesbaarheid altijd hoofdletter voor MySQL-functies, en bij lange queries kan het geen kwaad om er wat enters tussenin te plaatsen.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
$table
= "facturen";
$sql_query = "
SELECT datum,factnr,email,verkoper FROM "
.$table."
WHERE datum BETWEEN '"
.mysqli_real_escape_string($con, $_POST['begindatum'])."'
AND '"
.mysqli_real_escape_string($con, $_POST['einddatum'])."'";
?>
 
Ignace Verschaeve

Ignace Verschaeve

16/03/2015 17:08:57
Quote Anchor link
Ik krijg dit maar niet aan de praat.
Dit werkt:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
 $sql_query
= "SELECT datum,factnr,email,verkoper FROM $table
WHERE datum BETWEEN '2015-02-01' AND '2015-02-28'"
;
 
?>

Hier krijg ik netjes de data tussen de 2 datums.

Dit werkt niet:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
 $sql_query
= "SELECT datum,factnr,email,verkoper FROM $table
WHERE datum BETWEEN '"
.mysqli_real_escape_string($link, $_POST['date_5ISO8601'])."' AND '".mysqli_real_escape_string($link, $_POST['date_6ISO8601'])."'";
 ?>

Ik krijg een leeg csv bestand. Ook als ik 'begindatum' en 'einddatum' neem
Dit is het stukje code in het formulier (alleen voor de 1e datum, 2e datum is idem)
Ik gebruik Webplus8 om de site te maken

<html>
<input name="begindatum" class="OBJ-3" type="text" id="date_5" __AddCode="here" style="position:absolute;left:139px;top:27px;width:200px;height:22px;/*Add Style*/">
<script type="text/javascript">
$(function() {
$( "#date_5" ).datepicker({ beforeShow: function(input, inst) { setDatepickerCss(input); } });
$( "#date_5" ).datepicker( "option", $.datepicker.regional[ "nl" ] );
$( "#date_5" ).datepicker( "option", "dateFormat", "yy-mm-dd" );
$( "#date_5" ).datepicker( "option", "prevText", "" );
$( "#date_5" ).datepicker( "option", "nextText", "" );
$( "#date_5" ).datepicker( "option", "altField", "#date_5ISO8601" );
$( "#date_5" ).datepicker( "option", "altFormat", "yy-mm-dd" );
/*Add Script Here*/
});
</script>
<!--Postamble for Form Date Picker date_5-->
<input type="hidden" name="date_5ISO8601" id="date_5ISO8601">
</html>

Als ik dit stukje code uitvoer dan komen de datums wel op het uitvoerscherm dus is het blijkbaar niet aan de $POST gelegen.
<html>
<head>
<title>Form</title>
</head>

<body>

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
$FTGdatum1
=($_POST['date_5ISO8601']);
$FTGdatum2 =($_POST['date_6ISO8601']);

    echo "<h1>Hello " .$FTGdatum1. " - " .$FTGdatum2. "</h1>";
    // input ophalen

    ?>


</body>
</html>

Misschien nuttig: In de database is het veld datum van het type "date" jaar-maand-dag

Gelukkig ben ik al grijs, mijn haar kan alleen nog uitvallen. ;-)
 
- SanThe -

- SanThe -

16/03/2015 17:16:58
Quote Anchor link
En als je "yy-mm-dd" verandert in "yyyy-mm-dd"?
 
Ignace Verschaeve

Ignace Verschaeve

16/03/2015 18:19:44
Quote Anchor link
Dat is het niet want als ik dat verander in het formulier wordt het 20152015-02-01.Dus niet goed.In de database staat de datum ook als 2015-02-01.
Ik probeer het nog eens met een ander veld zoals verkoper of zoiets. where verkoper = input formulierveld.


Toevoeging op 16/03/2015 21:23:19:

Nog eens op een rijtje:
Uit te voeren script:
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
<?php

 
$host
= 'xxx'; // MYSQL database host adress
$db = 'xxx'; // MYSQL database name
$user = 'xxx'; // Mysql Datbase user
$pass = 'xxx'; // Mysql Datbase password
 
// Connect to the database

$link = mysql_connect($host, $user, $pass);
mysql_select_db($db);
 
require 'exportcsv1.inc.php';
 
$table="eva_tevr"; // this is the tablename that you want to export to csv from mysql.
 
exportMysqlToCsv($table);
 
?>

2e script exportcsv1.inc.php

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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
<?php
 
function exportMysqlToCsv($table,$filename = 'export.csv')
{

    $csv_terminated = "\n";
    $csv_separator = ";";
    $csv_enclosed = '"';
    $csv_escaped = "\\";
    $sql_query = "SELECT datum,factnr,email,verkoper,vriendwin,uitleg,crossel,aanbod,conform,opm_winkel FROM $table
WHERE 'verkoper' = '"
.mysqli_real_escape_string($link, $_POST['verkoper'])."'";

 
     // Gets the data from the database
    $result = mysql_query($sql_query);
    $fields_cnt = mysql_num_fields($result);
 
 
    $schema_insert = '';
 
    for ($i = 0; $i < $fields_cnt; $i++)
    {

        $l = $csv_enclosed . str_replace($csv_enclosed, $csv_escaped . $csv_enclosed,
            stripslashes(mysql_field_name($result, $i))) . $csv_enclosed;
        $schema_insert .= $l;
        $schema_insert .= $csv_separator;
    }
// end for
 
    $out = trim(substr($schema_insert, 0, -1));
    $out .= $csv_terminated;
 
    // Format the data
    while ($row = mysql_fetch_array($result))
    {

        $schema_insert = '';
        for ($j = 0; $j < $fields_cnt; $j++)
        {

            if ($row[$j] == '0' || $row[$j] != '')
            {

 
                if ($csv_enclosed == '')
                {

                    $schema_insert .= $row[$j];
                }
else
                {
                    $schema_insert .= $csv_enclosed .
                    str_replace($csv_enclosed, $csv_escaped . $csv_enclosed, $row[$j]) . $csv_enclosed;
                }
            }
else
            {
                $schema_insert .= '';
            }

 
            if ($j < $fields_cnt - 1)
            {

                $schema_insert .= $csv_separator;
            }
        }
// end for
 
        $out .= $schema_insert;
        $out .= $csv_terminated;
    }
// end while
 
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header("Content-Length: " . strlen($out));
    // Output to browser with appropriate mime type, you choose ;)
    header("Content-type: text/x-csv");
    //header("Content-type: text/csv");
    //header("Content-type: application/csv");

    header("Content-Disposition: attachment; filename=$filename");
    echo $out;
    exit;
 
}

 
?>

Dit loopt goed tot ik er deze WHERE conditie bij zet.

Ik heb nu eens foutmeldingen aangezet. Misschien geraakt er nog iemand wijs uit. Ik in elk geval niet meer.
Om het simpel te maken heb ik nu gekozen voor verkoper. Als je Annelies kiest moet er zeker iets uitkomen.

Maar ik krijg een lege tabel met tabelnamen weliswaar.

Probeer maar eens op www.telecomvanassche.be/resultaten.html

En ik die dacht om het wat simpeler te maken voor mijn collega's.
 
- SanThe -

- SanThe -

16/03/2015 21:32:14
Quote Anchor link
Je gebruikt twee soorten functies door elkaar. => mysql en mysqli.

En waar komt $link vandaan?
 
Ignace Verschaeve

Ignace Verschaeve

16/03/2015 21:51:58
Quote Anchor link
$link komt uit het eerste code fragment
// Connect to the database
$link = mysql_connect($host, $user, $pass);
mysql_select_db($db);

Ik heb daarnet nog zitten googelen en ik kreeg al een donkerblauw vermoeden dat de knoop daar ergens zat. Nu nog uitvlooien hoe ik het kan aanpassen en wat ik moet aanpassen.
Ik heb al geprobeerd om er dit van te maken:

$sql_query = "SELECT datum,factnr,email,verkoper,vriendwin,uitleg,crossel,aanbod,conform,opm_winkel FROM $table
WHERE 'verkoper' = '".mysql_real_escape_string($link, $_POST['verkoper'])."'";

Maar dat is het blijkbaar ook niet.
Gewijzigd op 16/03/2015 21:55:11 door Ignace Verschaeve
 
- SanThe -

- SanThe -

16/03/2015 21:57:06
Quote Anchor link
Het is een function en een $link die buiten de function is aangemaakt is niet bekend in de function.
Dit kan je onder andere oplossen door
global $link;
bovenin de function te zetten.
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

16/03/2015 22:32:28
Quote Anchor link
WHERE 'verkoper' = '".mysql_real_escape_string($link, $_POST['verkoper'])."'";

Tenzij er een verkoper is die 'verkoper' heet zal dit geen resultaat opleveren.
 
Ignace Verschaeve

Ignace Verschaeve

17/03/2015 07:58:31
Quote Anchor link
Ger van Steenderen op 16/03/2015 22:32:28:
WHERE 'verkoper' = '".mysql_real_escape_string($link, $_POST['verkoper'])."'";

Tenzij er een verkoper is die 'verkoper' heet zal dit geen resultaat opleveren.



Droge vaststelling waar ik niet veel mee ben.
Ik dacht dat dit gewoon wilde zeggen "Where" inhoud veld verkoper gelijk is aan "$Post" zijnde de inhoud opgegeven in het formulierveld. Zo heb ik het toch geleerd. Als ik schrijf Where verkoper = Annelies dan werkt het wel. Ik laat in het midden of er rond verkoper quotes moeten staan of niet maar dat is nu niet de oorzaak dat het niet werkt.
 
Obelix Idefix

Obelix Idefix

17/03/2015 09:27:12
Quote Anchor link
Ignace Verschaeve op 16/03/2015 18:19:44:

Warning: mysqli_real_escape_string() expects parameter 1 to be mysqli, null given in /customers/4/f/3/telecomvanassche.be/httpd.www/exportcsv1.inc.php on line 10 Warning: Cannot modify header information - headers already sent by (output started at /customers/4/f/3/telecomvanassche.be/httpd.www/exportcsv1.inc.php:10) in /customers/4/f/3/telecomvanassche.be/httpd.www/exportcsv1.inc.php on line 63 Warning: Cannot modify header information - headers already sent by (output started at /customers/4/f/3/telecomvanassche.be/httpd.www/exportcsv1.inc.php:10) in /customers/4/f/3/telecomvanassche.be/httpd.www/exportcsv1.inc.php on line 64 Warning: Cannot modify header information - headers already sent by (output started at /customers/4/f/3/telecomvanassche.be/httpd.www/exportcsv1.inc.php:10) in /customers/4/f/3/telecomvanassche.be/httpd.www/exportcsv1.inc.php on line 66 Warning: Cannot modify header information - headers already sent by (output started at /customers/4/f/3/telecomvanassche.be/httpd.www/exportcsv1.inc.php:10) in /customers/4/f/3/telecomvanassche.be/httpd.www/exportcsv1.inc.php on line 69 "datum";"factnr";"email";"verkoper";"vriendwin";"uitleg";"crossel";"aanbod";"conform";"opm_winkel"
 
Ivo P

Ivo P

17/03/2015 10:55:02
Quote Anchor link
het is

WHERE verkoper = 'Annelies'

Om kolomnamen komen geen quotes. Plaats je daar wel quotes omheen, dan krijg je geen foutmelding, want het is niet fout, maar er komt ook bijna nooit een resultaat.

Zoals Ger stelt: alleen als de naam van de gezochte persoon gelijk is aan de kolomnaam
 
Willem vp

Willem vp

17/03/2015 11:53:45
Quote Anchor link
> mysqli_real_escape_string() expects parameter 1 to be mysqli,

Je gebruikt een mysql_connect() om verbinding te maken met de database. Verwacht dan niet dat je mysqli_real_escape_string() kunt gebruiken. De mysql-functies zijn niet uitwisselbaar met mysqli-functies. Maar dat zei SanThe een paar posts geleden ook al. ;-)
Gewijzigd op 17/03/2015 11:54:15 door Willem vp
 
Ignace Verschaeve

Ignace Verschaeve

17/03/2015 13:13:46
Quote Anchor link
Ivo P op 17/03/2015 10:55:02:
het is

WHERE verkoper = 'Annelies'

Om kolomnamen komen geen quotes. Plaats je daar wel quotes omheen, dan krijg je geen foutmelding, want het is niet fout, maar er komt ook bijna nooit een resultaat.

Zoals Ger stelt: alleen als de naam van de gezochte persoon gelijk is aan de kolomnaam


Zoals gezegd dat werkt zonder quotes rond verkoper. Maar het is wel de bedoeling dat de naam van de verkoper uit een keuzeveld uit een formulier komt. Dus het is voor mij duidelijk dat de verkregen naam uit het formulier naar de WHERE voorwaarde gebracht wordt. Verkoper is een variabel gegeven (Tom, Steven Annelies whatever)
 
Willem vp

Willem vp

17/03/2015 13:25:37
Quote Anchor link
Even voor de duidelijkheid: wat iedereen bedoelt, maar niemand zegt, is dat er uiteindelijk

WHERE verkoper = '".mysql_real_escape_string($link, $_POST['verkoper'])."'"

moet komen te staan. ;-) Zónder quotes om de tabelnaam en mét quotes om de formulier-input.
Gewijzigd op 17/03/2015 13:27:44 door Willem vp
 
Ignace Verschaeve

Ignace Verschaeve

17/03/2015 14:08:58
Quote Anchor link
Na enige aanpassing is dit nog de foutmelding die ik krijg:

mysql_real_escape_string() expects parameter 1 to be string, resource given in /customers/4/f/3/telecomvanassche.be/httpd.www/exportcsv1.inc.php on line 12

De oplossing:
$sql_query = "SELECT datum,factnr,email,verkoper,vriendwin,uitleg,crossel,aanbod,conform,opm_winkel FROM $table
WHERE verkoper = '".mysql_real_escape_string($_POST['verkoper'],$link)."'";

het argument $link moet als 2e staan en niet als eerste en nu werkt het.

Joepie.

Toevoeging op 17/03/2015 19:24:32:

Zoals gezegd het werkt voor de variabelen,verkoper en technieker. Maar nog altijd niet voor het opvragen van een bepaalde datum. Dus daar moet ik nog iets op vinden. Alle velden zijn of integer of Char of gelijkaardig enkel datum is van het type Date en ik denk dat daar iets misloopt met de omzetting of uitlezing. We blijven zoeken.
 
Ignace Verschaeve

Ignace Verschaeve

20/03/2015 19:14:05
Quote Anchor link
Ik ben er nog niet helemaal uit. Output gesorteerd op "verkoper" technieker dat lukt.
Maar op datum dat blijft blokkeren.
Ik krijg nu de volgende foutmelding:
Parse error: syntax error, unexpected 'Cache' (T_STRING) in /customers/4/f/3/telecomvanassche.be/httpd.www/exportcsv.inc.php on line 66
Niettegenstaande dat exact dezelfde lijn in de andere scripts voorkomt die sorteren op verkoper of technieker.

Nog eens de code:
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
<?php
 function exportMysqlToCsv($table,$filename = 'export.csv')
{

    global $link;
    
    $csv_terminated = "\n";
    $csv_separator = ";";
    $csv_enclosed = '"';
    $csv_escaped = "\\";
    $sql_query = "SELECT datum,factnr,email,verkoper,vriendwin,uitleg,crossel,aanbod,confom,opm_winkel FROM $table
WHERE datum BETWEEN '"
.mysql_real_escape_string($_POST['date_1ISO8601'],$link)."'
AND '"
.mysql_real_escape_string($_POST['date_2ISO8601'],$link)."';

      // Gets the data from the database
    $result = mysql_query($sql_query);
    $fields_cnt = mysql_num_fields($result);
  
    $schema_insert = '';
 
    for ($i = 0; $i < $fields_cnt; $i++)
    {
        $l = $csv_enclosed . str_replace($csv_enclosed, $csv_escaped . $csv_enclosed,
            stripslashes(mysql_field_name($result, $i))) . $csv_enclosed;
        $schema_insert .= $l;
        $schema_insert .= $csv_separator;
    } // end for
 
    $out = trim(substr($schema_insert, 0, -1));
    $out .= $csv_terminated;
 
    // Format the data
    while ($row = mysql_fetch_array($result))
    {
        $schema_insert = '';
        for ($j = 0; $j < $fields_cnt; $j++)
        {
            if ($row[$j] == '0' || $row[$j] != '')
            {
 
                if ($csv_enclosed == '')
                {
                    $schema_insert .= $row[$j];
                } else
                {
                    $schema_insert .= $csv_enclosed .
                    str_replace($csv_enclosed, $csv_escaped . $csv_enclosed, $row[$j]) . $csv_enclosed;
                }
            } else
            {
                $schema_insert .= '';
            }
 
            if ($j < $fields_cnt - 1)
            {
                $schema_insert .= $csv_separator;
            }
        } // end for
 
        $out .= $schema_insert;
        $out .= $csv_terminated;
    } // end while


[b]// Hier loopt het fout.[/b]
 
    header("
Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header("
Content-Length: " . strlen($out));
    // Output to browser with appropriate mime type, you choose ;)
    header("
Content-type: text/x-csv");
    //header("
Content-type: text/csv");
    //header("
Content-type: application/csv");
    header("
Content-Disposition: attachment; filename=$filename");
    echo $out;
    exit;

}

 
?>
Gewijzigd op 20/03/2015 19:15:06 door Ignace Verschaeve
 
Ivo P

Ivo P

20/03/2015 19:20:13
Quote Anchor link
kijk eens naar de kleurtjes hierboven.

op regel 12 aan het einde mist een " voor de ;
 

Pagina: « vorige 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.