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());
È stato utile?

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());
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top