Проверьте, если эта дата уже в БД - PullRequest
0 голосов
/ 22 января 2019

Мне нужно сделать так, чтобы люди могли арендовать машину, но когда машина арендована, ей не нужно бронировать ее снова.поэтому мне нужно проверить, если машина уже арендована в те дни.

if (isset($_POST['Huur'])) {
global $db;

$kenteken = htmlspecialchars($_POST["Kenteken"]);
$klantcode = $_SESSION['USERID'];
$factuurdatum = date("Y-m-d");


    $test = "SELECT * 
        FROM factuurregel 
        LEFT JOIN auto 
        ON factuurregel.Kenteken = auto.Kenteken

        LEFT JOIN factuur 
        ON factuurregel.Factuurnummer = factuur.Factuurnummer

        LEFT JOIN gebruiker 
        ON factuur.Klantcode = gebruiker.Klantcode

        WHERE gebruiker.Klantcode =:code AND auto.kenteken =:groen";

        $stmt10 = $db->prepare($test);
        $data10 = array("code" => $klantcode, "groen" => $kenteken);

        try {
            $stmt10->execute($data10);

        } 
        catch (PDOException $e) {
          echo $e->getMessage();
        }

$check = true;
foreach ($db->query($test) as $invoice) {
    if ($invoice['Begindatum'] <= $_POST['Begindatum'] && $invoice['Einddatum'] >= $_POST['Einddatum']) {
        $check = false;
    }
}
if ($check) {
    $sqlstatement = "INSERT INTO factuur (Factuurdatum, Kenteken, Klantcode)
        VALUES (:Factuurdatum, :Kenteken, :Klantcode)";
        $stmt = $db->prepare($sqlstatement);
        $data = array("Factuurdatum" => $factuurdatum, "Kenteken" => $kenteken, "Klantcode" => $klantcode);

        try {
            $stmt->execute($data);
            $factuurnummer = $db->lastInsertId(); 

        } 
        catch (PDOException $e) {
          echo $e->getMessage();
        }

        $begindatum = htmlspecialchars($_POST["Begindatum"]);
        $einddatum = htmlspecialchars($_POST["Einddatum"]);

        $sqlstatement1 = "INSERT INTO factuurregel (Factuurnummer, Kenteken, Begindatum, Einddatum)
        VALUES (:Factuurnummer, :Kenteken, :Begindatum, :Einddatum)";
        $stmt1 = $db->prepare($sqlstatement1);
        $data1 = array("Factuurnummer" => $factuurnummer, "Kenteken" => $kenteken, "Begindatum" => $begindatum, "Einddatum" => $einddatum);

        try {
            $stmt1->execute($data1);

        } 
        catch (PDOException $e) {
          echo $e->getMessage();
        }

    $password_err = "Uw auto is succesvol gereserveerd";
    echo '<script type="text/javascript">alert("'.$password_err.'");</script>';
}

}

Я думаю, что почти получил, но этот код выдаст мне эту ошибку:

Неустранимая ошибка: Uncaught PDOException: SQLSTATE [42000]: Синтаксическая ошибка или нарушение прав доступа: 1064 В синтаксисе SQL есть ошибка;проверьте руководство, соответствующее вашей версии сервера MariaDB, на предмет правильного синтаксиса для использования рядом с ': code AND auto.kenteken =: groen' в строке 12 в C: \ xampp \ htdocs \ Rent-a-Car \ pages \ auto.php: 260 Трассировка стека: # 0 C: \ xampp \ htdocs \ Rent-a-Car \ pages \ auto.php (260): запрос PDO-> ('SELECT * \ r \ n ...') # 1 {main} брошенный в C: \ xampp \ htdocs \ Rent-a-Car \ pages \ auto.php в строке 260

Эта ошибка скажет мне, что есть проблема в этой строке: WHERE gebruiker.Klantcode =:code AND auto.kenteken =:groen"; но яПонятия не имею, что.

1 Ответ

0 голосов
/ 22 января 2019

Ваша ошибка вызвана foreach ($db->query($test) as $invoice) {. Функция query( не работает с привязками и дублирует функциональность execute, если она работает. Вы должны заменить это на while и fetch или использовать fetchall.

try {
   $stmt10->execute($data10);
   $invoices = $stmt10->fetchAll();
} 

затем измените:

foreach ($db->query($test) as $invoice) {

до:

foreach ($invoices as $invoice) {

В качестве альтернативы, без fetchall вы можете заменить foreach на:

while($invoice = $stmt10->fetch(PDO::FETCH_ASSOC)){
...