【问题标题】:Check if this date is already in DB检查此日期是否已在数据库中
【发布时间】:2019-06-15 23:13:25
【问题描述】:

我需要这样做,以便人们可以租一辆车,但是当汽车被租用时,它不需要再次预订。所以我需要检查一下这几天车是不是已经租了。

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>';
}

}

我想我差不多明白了,但是这段代码会给我这个错误:

致命错误:未捕获的 PDOException:SQLSTATE[42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,以在 C:\xampp\htdocs\Rent-a-Car\pages\auto.php 的第 12 行的 ':code AND auto.kenteken =:groen' 附近使用正确的语法:260 堆栈跟踪:#0 C:\xampp\htdocs\Rent-a-Car\pages\auto.php(260): PDO->query('SELECT * \r\n ...') #1 {main } 在第 260 行的 C:\xampp\htdocs\Rent-a-Car\pages\auto.php 中抛出

这个错误会告诉我他们在这条线上的概率:WHERE gebruiker.Klantcode =:code AND auto.kenteken =:groen"; 但我不知道是什么。

【问题讨论】:

  • 那些 LEFT JOIN 会返回常规的 INNER JOIN 结果。如果您真的想要 LEFT JOIN 结果,请将条件从 WHERE 移到 ON。
  • @jarlh INNER JOIN 也没有用,我已经试过了。
  • 但是你的 gebruiker 在实践中是内联的。
  • 你能澄清你的问题吗?检查数据库中是否已经存在某个日期,或者问题是否存在于其他地方,您是否有任何问题?

标签: php mysql pdo prepared-statement


【解决方案1】:

您的错误是由foreach ($db-&gt;query($test) as $invoice) { 引起的。 query( 函数不适用于绑定,如果这样做,它将复制 execute 功能。您应该将其替换为 whilefetch 或使用 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)){

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-31
    • 2018-07-11
    • 1970-01-01
    • 2017-07-28
    • 2011-05-16
    • 1970-01-01
    • 2010-10-26
    相关资源
    最近更新 更多