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
<?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.
WHERE 'verkoper' = '".mysql_real_escape_string($link, $_POST['verkoper'])."'";

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

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.
Ignace Verschaeve op 16/03/2015 18:19:44

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

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"
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
> 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. ;-)
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)

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.
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.

[size=xsmall]Toevoeging op 17/03/2015 19:24:32:[/size]

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.
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:
<?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


// Hier loopt het fout.

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;

}

?>
kijk eens naar de kleurtjes hierboven.

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

Reageren