Hai bisogno di aiuto con una query / PHP MySQL che coinvolgono intervalli di date
-
19-09-2019 - |
Domanda
In sostanza ho bisogno di recuperare alcune informazioni conto dalla tabella dBASE dove hanno un cliente del cliente che è stata passata via GET, e la data di conto di collocamento (dateplaced) è tra le inizio e fine date passati dai campi del calendario di nuovo via GET.
La query di seguito non restituisce alcuna riga. Ho verificato che i SELECT e dalle parti del lavoro di query come destinati, e il client selezionare dalla GET funziona bene, in modo che lascia i problemi di data. "Dateplaced" viene memorizzato nel database come un varchar in formato "gg / mm / aaaa". Al momento la ricerca ho trovato che mysql vuole date nel formato "AAAA-MM-dd". Ho messo insieme le due parti del confronto tra i dai dati GET, e sono abbastanza certo che sono formattati correttamente. Ho provato semplicemente chiaramente usando "dateplaced" invece di str_to_date () e non ha funzionato, così ho provato str_to_date (), come illustrato di seguito, ma ancora non funziona.
Qualcuno può macchiare il mio problema qui? Questo mi sta facendo impazzire.
$query = mysql_query("SELECT accountnumber, firstname, middlename, lastname, currentbalance FROM dbase WHERE clientname = '" . $_GET['client'] . "' AND str_to_date(dateplaced, '%Y-%m-%d') BETWEEN '" . $_GET['calendar_start_year'] . "-" . $_GET['calendar_start_month'] . "-" . $_GET['calendar_start_day'] . "' AND '" . $_GET['calendar_end_year'] . "-" . $_GET['calendar_end_month'] . "-" . $_GET['calendar_end_day'] . "' ORDER BY lastname") or die(mysql_error());
Soluzione
str_to_date()
prende il formato della stringa esistente, non la stringa desiderata. Quindi è necessario
str_to_date(dateplaced, '%d/%m/%Y')
per ottenere Y-m-d.
Fate la vostra data di creazione di fuori della query. E 'più facile per eseguire il debug.
$clean_name=mysqli_real_escape_string($_GET['client']);
$start_date=date_create("{$_GET['calendar_start_year']}-{$_GET['calendar_start_month']}-{$_GET['calendar_start_day']}")->format('Y-m-d');
$end_date=date_create("{$_GET['calendar_end_year']}-{$_GET['calendar_end_month']}-{$_GET['calendar_end_day']}")->format('Y-m-d');
$q="SELECT accountnumber, firstname, middlename, lastname, currentbalance
FROM dbase
WHERE clientname = '{$clean_name}'
AND str_to_date(dateplaced, '%d/%m/%Y') BETWEEN '$start_date' AND '$end_date'
ORDER BY lastname;
PS, pulire tutte le variabili. Ci possono essere virgolette o altri caratteri che devono essere sfuggito (o tentativi degli hacker cattivi). mysqli_real_escape_string()
è ciò che si dovrebbe usare.
Altri suggerimenti
Prima di tutto, si hanno lasciato da soli spalancata a SQL injection per non fuggire variabili utente prima di inserirli nella vostra query (vedi mysql_real_escape_string
).
La ragione per la query non funziona è perché s ' STR_TO_DATE
secondo parametro ha bisogno il formato della vostra stringa di origine, non il formato che si sta tentando di convertire in.
// extract variables
$client = $_GET['client'];
$startYear = $_GET['calendar_start_year'];
$startMonth = $_GET['calendar_start_month'];
$startDay = $_GET['calendar_start_day'];
$endYear = $_GET['calendar_end_year'];
$endMonth = $_GET['calendar_end_month'];
$endDay = $_GET['calendar_end_day'] ;
// parse variables
$startDate = mktime(0, 0, 0, $startMonth, $startDay, $startYear);
$endDate = mktime(0, 0, 0, $endMonth, $endDay, $endYear);
// query database
$sql = sprintf(
"SELECT accountnumber,
firstname,
middlename,
lastname,
currentbalance
FROM dbase
WHERE clientname = '%s'
AND STR_TO_DATE(dateplaced, '%d/%m/%Y') BETWEEN '%s' AND '%s'
ORDER BY lastname",
mysql_real_escape_string($client),
date('Y-m-d', $startDate),
date('Y-m-d', $endDate));
$result = mysql_query($sql) or die(mysql_error());