2015-07-14 1 views
-1

J'essaie d'exécuter une instruction préparée MySQLI qui interrogera une base de données MySQL et retournera les résultats en fonction des données demandées dans le formulaire . J'ai réussi à faire fonctionner cette déclaration préparée et à ramener les données correctement. Maintenant, je veux être en mesure d'ajouter une «plage de dates» à la requête et je ne peux pas obtenir cela pour fonctionner. J'ai ajouté un sélecteur de date en haut du formulaire de demande en faisant les champs From et Toinput type="date". Cela ajoute la date aux champs au format MM/DD/YYYY. Dans la base de données, la colonne que je vérifie est de type date et est au format YYYY-MM-DD. J'ai essayé plusieurs suggestions différentes de ce site et d'autres que j'ai rencontrées à partir de la recherche, mais obtenir des erreurs. J'ai essayé d'utiliser strtotime et date et obtenir les erreurs que la date est dans le mauvais format et l'erreur fatale can't construct DatePeriod(). J'utilise PHP v5.5 donc je lis que vous pouvez utiliser DateTime::createFromFormat avec $string->format et ensuite utiliser DatePeriod et cela fonctionnerait mais je reçois une autre erreur fatale Call to member function format() on a non-object. S'il vous plaît aider.MySQLI instruction préparée et montrer les résultats de la requête pour une plage de dates entrée avec un datpicker PHP sur le formulaire

Voici le code pour le « Formulaire de recherche »

<form action="../includes/test.inc.php" method="get"> 
      <table border="0" cellspacing="1"> 
      <tr> 
      Dates:<br> 
      From:&nbsp;<input type="date" id="from" name="from"> 

&nbsp;&nbsp;&nbsp; 

      To:&nbsp;<input type="date" id="to" name="to"> 

      </br></br> 

      Result: <input type="text" name="result" id="result" /><br> 
      Employee: <input type="text" name="employee" id="employee" /><br> 
      Project: <input type="text" name="project" id="project" /><br> 
      Source: <input type="text" name="source" id="source" /><br> 
      Appointment Date: <input type="text" name="appt_date" id="appt_date" /><br> 
      Branch: <input type="text" name="branch" id="branch" /><br> 
      First Name: <input type="text" name="fname" id="fname" /><br> 
      Last Name: <input type="text" name="lname" id="lname" /><br> 
      Last Four: <input type="text" name="last_four" id="last_four" /><br> 
      Phone: <input type="text" name="phone" id="phone" /><br> 
      City: <input type="text" name="city" id="city" /><br> 
      State: <input type="text" name="state" id="state" /><br> 
      Zip: <input type="text" name="zip" id="zip" /><br> 


      <input type="submit" value="submit" /> 
      </tr> 
      </table> 
      </form> 

Voici le code pour le « Formulaire de traitement d'action »

<?php 
include_once 'db_connect.php'; 
include_once 'psl-config.php'; 

session_start(); 

$error_msg = ""; 

if (isset($_GET['from'])) 
$date = $_GET['from']; 
if (isset($_GET['to'])) 
$date2 = $_GET['to']; 
if (isset($_GET['set_date'])) 
$set_date = $_GET['set_date']; 
if (isset($_GET['result'])) 
$result = $_GET['result']; 
if (isset($_GET['employee'])) 
$employee = $_GET['employee']; 
if (isset($_GET['project'])) 
$employee = $_GET['project']; 
if (isset($_GET['source'])) 
$source = $_GET['source']; 
if (isset($_GET['appt_date'])) 
$appt_date = $_GET['appt_date']; 
if (isset($_GET['branch'])) 
$branch = $_GET['branch']; 
if (isset($_GET['fname'])) 
$fname = $_GET['fname']; 
if (isset($_GET['lname'])) 
$lname = $_GET['lname']; 
if (isset($_GET['last_four'])) 
$last_four = $_GET['last_four']; 
if (isset($_GET['phone'])) 
$phone = $_GET['phone']; 
if (isset($_GET['city'])) 
$city = $_GET['city']; 
if (isset($_GET['state'])) 
$state = $_GET['state']; 
if (isset($_GET['zip'])) 
$zip = $_GET['zip']; 

$query = $mysqli->prepare("SELECT set_date, result, employee, project, source, appt_date, branch, fname, lname, last_four, phone, city, state, zip, monthly_net, job_time FROM appointments WHERE set_date LIKE CONCAT('%', ?, '%') AND result LIKE CONCAT('%', ?, '%') AND employee LIKE CONCAT('%', ?, '%') AND project LIKE CONCAT('%', ?, '%') AND source LIKE CONCAT('%', ?, '%') AND appt_date LIKE CONCAT('%', ?, '%') AND branch LIKE CONCAT('%', ?, '%') AND fname LIKE CONCAT('%', ?, '%') AND lname LIKE CONCAT('%', ?, '%') AND last_four LIKE CONCAT('%', ?, '%') AND phone LIKE CONCAT('%', ?, '%') AND city LIKE CONCAT('%', ?, '%') AND state LIKE CONCAT('%', ?, '%') AND zip LIKE CONCAT('%', ?, '%') ORDER BY employee"); 
if (isset($_GET['from'])) { 
    $date = DateTime::createFromFormat('m/d/Y', $_GET['from']); 
    $date2 = DateTime::createFromFormat('m/d/Y', $_GET['to']); 

    $from = $date->format('Y-m-d'); 
    $to = $date2->format('Y-m-d'); 

    $daterange = new DatePeriod($from, $to); 
    foreach($daterange as $dr) { 
$query->bind_param('sssssssssssssss', $dr, $_GET['set_date'], $_GET['result'], $_GET['employee'], $_GET['project'], $_GET['source'], $_GET['appt_date'], $_GET['branch'], $_GET['fname'], $_GET['lname'], $_GET['last_four'], $_GET['phone'], $_GET['city'], $_GET['state'], $_GET['zip']); 
$query->execute(); 
    } 
} 
$query->store_result(); 
$query->bind_result($set_date, $result, $employee, $project, $source, $appt_date, $branch, $fname, $lname, $last_four, $phone, $city, $state, $zip); 
$rows = $query->num_rows; 
$results = array(); 
while($row = $query->fetch()) { 
    $results[] = array(
    'rows' => $rows, 
    'set_date' => $set_date, 
    'result' => $result, 
    'employee' => $employee, 
    'project' => $project, 
    'source' => $source, 
    'appt_date' => $appt_date, 
    'branch' => $branch, 
    'fname' => $fname, 
    'lname' => $lname, 
    'last_four' => $last_four, 
    'phone' => $phone, 
    'city' => $city, 
    'state' => $state, 
    'zip' => $zip 
    ); 
} 
$_SESSION['results'] = $results; 
if($results) { 
     header('Location: ../test_page.php'); 
     }else{ 
     header('Location: ../test.php?error=1'); 
    } 

$query->free_result(); 
$mysqli->close(); 
?> 

MISE À JOUR: Je suis en mesure d'éliminer toutes les erreurs Je recevais mais je n'arrive toujours pas à faire fonctionner la plage de dates. Je n'ai pas changé de code sur la 'page de formulaire', mais voici le code mis à jour pour la 'page de traitement'. Maintenant, je suis envoyé à la page 'error = 1' comme s'il n'y avait pas de résultats mais je sais qu'il y a des résultats et ils reviennent correctement si je supprime la partie de période.

<?php 
include_once 'db_connect.php'; 
include_once 'psl-config.php'; 

session_start(); 

$error_msg = ""; 

if (isset($_GET['from'])) 
$date = $_GET['from']; 
if (isset($_GET['to'])) 
$date2 = $_GET['to']; 
if (isset($_GET['set_date'])) 
$set_date = $_GET['set_date']; 
if (isset($_GET['result'])) 
$result = $_GET['result']; 
if (isset($_GET['employee'])) 
$employee = $_GET['employee']; 
if (isset($_GET['project'])) 
$employee = $_GET['project']; 
if (isset($_GET['source'])) 
$source = $_GET['source']; 
if (isset($_GET['appt_date'])) 
$appt_date = $_GET['appt_date']; 
if (isset($_GET['branch'])) 
$branch = $_GET['branch']; 
if (isset($_GET['fname'])) 
$fname = $_GET['fname']; 
if (isset($_GET['lname'])) 
$lname = $_GET['lname']; 
if (isset($_GET['last_four'])) 
$last_four = $_GET['last_four']; 
if (isset($_GET['phone'])) 
$phone = $_GET['phone']; 
if (isset($_GET['city'])) 
$city = $_GET['city']; 
if (isset($_GET['state'])) 
$state = $_GET['state']; 
if (isset($_GET['zip'])) 
$zip = $_GET['zip']; 

if (isset($_GET['from'])) { 
    $from = new DateTime($_GET['from']); 
    $to = new DateTime($_GET['to']); 

    var_dump($from, $to); 

    $interval = DateInterval::createFromDateString('1 day');  
    $daterange = new DatePeriod($from, $interval, $to); 
    if (isset($daterange)) { 
$query = $mysqli->prepare("SELECT set_date, result, employee, project, source, appt_date, branch, fname, lname, last_four, phone, city, state, zip FROM appointments WHERE set_date LIKE CONCAT('%', ?, '%') AND result LIKE CONCAT('%', ?, '%') AND employee LIKE CONCAT('%', ?, '%') AND project LIKE CONCAT('%', ?, '%') AND source LIKE CONCAT('%', ?, '%') AND appt_date LIKE CONCAT('%', ?, '%') AND branch LIKE CONCAT('%', ?, '%') AND fname LIKE CONCAT('%', ?, '%') AND lname LIKE CONCAT('%', ?, '%') AND last_four LIKE CONCAT('%', ?, '%') AND phone LIKE CONCAT('%', ?, '%') AND city LIKE CONCAT('%', ?, '%') AND state LIKE CONCAT('%', ?, '%') AND zip LIKE CONCAT('%', ?, '%') ORDER BY employee"); 
$query->bind_param('ssssssssssssss', $_GET['set_date'], $_GET['result'], $_GET['employee'], $_GET['project'], $_GET['source'], $_GET['appt_date'], $_GET['branch'], $_GET['fname'], $_GET['lname'], $_GET['last_four'], $_GET['phone'], $_GET['city'], $_GET['state'], $_GET['zip']); 
$query->execute(); 
    } 
} 
$query->store_result(); 
$query->bind_result($set_date, $result, $employee, $project, $source, $appt_date, $branch, $fname, $lname, $last_four, $phone, $city, $state, $zip); 
$rows = $query->num_rows; 
$results = array(); 
while($row = $query->fetch()) { 
    $results[] = array(
    'rows' => $rows, 
    'set_date' => $set_date, 
    'result' => $result, 
    'employee' => $employee, 
    'project' => $project, 
    'source' => $source, 
    'appt_date' => $appt_date, 
    'branch' => $branch, 
    'fname' => $fname, 
    'lname' => $lname, 
    'last_four' => $last_four, 
    'phone' => $phone, 
    'city' => $city, 
    'state' => $state, 
    'zip' => $zip 
    ); 
} 
$_SESSION['results'] = $results; 
if($results) { 
     header('Location: ../test_page.php'); 
     }else{ 
     header('Location: ../test.php?error=1'); 
    } 

$query->free_result(); 
$mysqli->close(); 
?> 
+0

pourquoi vous ne divisez pas la valeur et créez une nouvelle date avec le tableau? –

+0

Le code fonctionne comme je l'attendrais, http://sandbox.onlinephpfunctions.com/code/13d4bd57715b8a7b7ca7de59089106a4b7298dd1. Pouvez-vous fournir un exemple reproductible? Peut-être que c'est quelque chose avec l'entrée que vous fournissez .. – chris85

+0

@ chris85 pour le 'DateTime :: createFromFormat ('m/d/Y', '07/14/2015 ')' Je veux utiliser la date qui est sélectionnée dans la forme. Comment puis je faire ça. J'essaie 'DateTime :: createFromFormat ('m/d/Y', $ _GET ['de'])'. Aussi je reçois une erreur pour 'créer' la plage de dates '$ daterange = new DatePeriod ($ from, $ to);' – Derek

Répondre

0

J'ai finalement été capable de comprendre cela. Il semble que j'essayais de rendre plus compliqué que nécessaire. Voici le code que j'utilisé pour obtenir la requête pour travailler avec l'entrée de la plage de dates de la forme

include_once 'db_connect.php'; 
include_once 'psl-config.php'; 

session_start(); 

$error_msg = ""; 

if (isset($_GET['from'])) 
$from = $_GET['from']; 
if (isset($_GET['to'])) 
$to = $_GET['to']; 
if (isset($_GET['set_date'])) 
$set_date = $_GET['set_date']; 
if (isset($_GET['result'])) 
$result = $_GET['result']; 
if (isset($_GET['employee'])) 
$employee = $_GET['employee']; 
if (isset($_GET['project'])) 
$employee = $_GET['project']; 
if (isset($_GET['source'])) 
$source = $_GET['source']; 
if (isset($_GET['appt_date'])) 
$appt_date = $_GET['appt_date']; 
if (isset($_GET['branch'])) 
$branch = $_GET['branch']; 
if (isset($_GET['fname'])) 
$fname = $_GET['fname']; 
if (isset($_GET['lname'])) 
$lname = $_GET['lname']; 
if (isset($_GET['last_four'])) 
$last_four = $_GET['last_four']; 
if (isset($_GET['phone'])) 
$phone = $_GET['phone']; 
if (isset($_GET['city'])) 
$city = $_GET['city']; 
if (isset($_GET['state'])) 
$state = $_GET['state']; 
if (isset($_GET['zip'])) 
$zip = $_GET['zip']; 

$from = date("Y-m-d", strtotime($from)); 
$to = date("Y-m-d", strtotime($to)); 

$query = $mysqli->prepare("SELECT set_date, result, employee, project, source, appt_date, branch, fname, lname, last_four, phone, city, state, zip FROM appointments WHERE set_date BETWEEN '".$from."' AND '".$to."' AND set_date LIKE CONCAT('%', ?, '%') AND result LIKE CONCAT('%', ?, '%') AND employee LIKE CONCAT('%', ?, '%') AND project LIKE CONCAT('%', ?, '%') AND source LIKE CONCAT('%', ?, '%') AND appt_date LIKE CONCAT('%', ?, '%') AND branch LIKE CONCAT('%', ?, '%') AND fname LIKE CONCAT('%', ?, '%') AND lname LIKE CONCAT('%', ?, '%') AND last_four LIKE CONCAT('%', ?, '%') AND phone LIKE CONCAT('%', ?, '%') AND city LIKE CONCAT('%', ?, '%') AND state LIKE CONCAT('%', ?, '%') AND zip LIKE CONCAT('%', ?, '%') ORDER BY set_date ASC"); 
$query->bind_param('ssssssssssssss', $_GET['set_date'], $_GET['result'], $_GET['employee'], $_GET['project'], $_GET['source'], $_GET['appt_date'], $_GET['branch'], $_GET['fname'], $_GET['lname'], $_GET['last_four'], $_GET['phone'], $_GET['city'], $_GET['state'], $_GET['zip']); 
$query->execute(); 
$query->store_result(); 
$query->bind_result($set_date, $result, $employee, $project, $source, $appt_date, $branch, $fname, $lname, $last_four, $phone, $city, $state, $zip); 
$rows = $query->num_rows; 
$results = array(); 
while($row = $query->fetch()) { 
    $results[] = array(
    'rows' => $rows, 
    'set_date' => $set_date, 
    'result' => $result, 
    'employee' => $employee, 
    'project' => $project, 
    'source' => $source, 
    'appt_date' => $appt_date, 
    'branch' => $branch, 
    'fname' => $fname, 
    'lname' => $lname, 
    'last_four' => $last_four, 
    'phone' => $phone, 
    'city' => $city, 
    'state' => $state, 
    'zip' => $zip 
    ); 
} 
$_SESSION['results'] = $results; 
if($results) { 
     header('Location: ../appointments_page.php'); 
     }else{ 
     header('Location: ../appointments.php?error=1'); 
} 
$query->free_result(); 
$mysqli->close(); 
?> 

Juste besoin la partie $from = date("Y-m-d", strtotime($from) et $to = date("Y-m-d", strtotime($to) et WHERE set_date BETWEEN '".$from."' AND '".$to."' dans mon instruction SELECT. Merci pour toutes les suggestions et espérons que cette réponse peut aider quelqu'un d'autre

-1
function new_date($str) { 
$str = strtotime($str); 
$str = date('d-m-Y',$str); 
return $str; 
} 
utilisation

: NEW_DATE ('AAAA-MM-DD'); sortie: utilisation DD-MM-YYYY

function new_date($str) { 
$str = strtotime($str); 
$str = date('Y-m-d',$str); 
return $str; 
} 

: NEW_DATE ('DD-MM-YYYY'); sortie: YYYY-MM-DD

+0

est-il un moyen de le faire sans utiliser une fonction? – Derek