Prepared Statement(PHP5,SQLite3)执行时间超过30秒

时间:2016-04-28 20:38:55

标签: php pdo sqlite

我试图通过PHP避免在SQLite3数据库中自动生成随机数的重复条目。为此,我在do while循环中准备了语​​句。生成随机数,然后查询检查该数字是否已存在。如果是,则再次生成,如果不是,则继续生成。

至少,这就是我想要实现的目标......

但由于某些我不知道的原因,PHP日志一直向我显示在查询行中已经执行了30秒的最大执行时间。首先,我试着在没有准备好的陈述的情况下完成整个事情并且它没有工作。我以为那是因为我在查询中有php变量。所以我切换到准备好的陈述没有成功。

我通过Firebug检查了所有的POST变量,一切似乎都很好。这是准备好的声明给我腹泻!!

你能帮帮我吗?

PHP代码:

<?php

$adate    = $_POST['adate'];
$ddate    = $_POST['ddate'];
$ad       = $_POST['ad'];
$dd       = $_POST['dd'];
$fname    = $_POST['fname'];
$lname    = $_POST['lname'];
$email    = $_POST['email'];
$address  = $_POST['address'];
$postal   = $_POST['postal'];
$city     = $_POST['city'];
$country  = $_POST['country'];
$tel      = $_POST['tel'];
$message  = $_POST['message'];
$price    = $_POST['price'];
$bkfst    = $_POST['bkfst'];
$rnum     = $_POST['rnum'];
$rtype    = $_POST['rtype'];
$robotest = $_POST['blnk'];
$bid      = 0;
$cid      = 0;
$adate    = $adate . " 20:00:00";
$ddate    = $ddate . " 13:00:00";

if ($robotest)
    $error = "You are a gutless robot.";

else {

    function bid()
    {
        $bid = mt_rand(111111, 999999);
        if (($bid % 10) == 0) {
            $bid = $bid + 123;
        }
    }

    function cid()
    {
        $cid = mt_rand(11111, 99999);
        if (($cid % 10) == 0) {
            $cid = $cid + 123;
        }
    }

    include 'connect.php';

    do {
        cid();
    --> $sth = $db->prepare("SELECT COUNT (CustomerID) from Customer WHERE CustomerID = ?");
        $sth->execute(array($cid));
    } while ($sth->fetchColumn() > 0);

    $sth = $db->prepare("INSERT INTO Customer (CustomerID, FirstName, LastName, Address, PostalCode, City, Country, EMail, Phone) VALUES ('$cid', '$fname', '$lname', '$address', '$postal', '$city', '$country', '$email', '$tel')");
    $sth->execute();

    do {
        bid();
    --> $sth = $db->prepare("SELECT COUNT (BookingID) from Booking WHERE BookingID = ?");
        $sth->execute(array($bid));
    } while ($sth->fetchColumn() > 0);

    $sth = $db->prepare("INSERT INTO Booking (BookingID, Arrival, Checkout, RoomNumber, CustomerID, Breakfast, Comment, Paid) VALUES ('$bid', '$adate', '$ddate', '$rnum', '$cid', '$bkfst', '$message', 'N')");
    $sth->execute();

    $subject = "Your Booking";
    $message = "Hi $fname,\n\nA $rtype from $ad to $dd has been booked for you.\n\nYour Booking Code is $bid.\n\nRegards.";

    mail($email, $subject, $message);

    echo 'The Booking completed successfully! Check your E-Mail for further Information.';
}

?>

以 - &gt;开头的行在代码中是有问题的行。

是的,我是一个新手,他正在边做边学,并且还在Stack Overflow论坛中通过讨厌的人学习:)

感谢。

编辑:

这就是我的代码现在的样子。所有错误都消失了但是php没有向DB插入任何内容。使用生成的号码正确发送电子邮件。

<?php

$adate    = $_POST['adate'];
$ddate    = $_POST['ddate'];
$ad       = $_POST['ad'];
$dd       = $_POST['dd'];
$fname    = $_POST['fname'];
$lname    = $_POST['lname'];
$email    = $_POST['email'];
$address  = $_POST['address'];
$postal   = $_POST['postal'];
$city     = $_POST['city'];
$country  = $_POST['country'];
$tel      = $_POST['tel'];
$message  = $_POST['message'];
$price    = $_POST['price'];
$bkfst    = $_POST['bkfst'];
$rnum     = $_POST['rnum'];
$rtype    = $_POST['rtype'];
$robotest = $_POST['blnk'];
$adate    = $adate . " 20:00:00";
$ddate    = $ddate . " 13:00:00";
$cid;
$bid;

if ($robotest)
    $error = "You are a gutless robot.";

else {

    function bid()
    {
        global $bid;
        $bid = mt_rand(111111, 999999);
        if (($bid % 10) == 0) {
            $bid = $bid + 123;

        }
    }

    function cid()
    {
        global $cid;
        $cid = mt_rand(11111, 99999);
        if (($cid % 10) == 0) {
            $cid = $cid + 123;

        }
    }

    include 'connect.php';

    do {
        global $cid;
        cid();
        $sth = $db->prepare('SELECT COUNT (CustomerID) from Customer WHERE CustomerID = ?');
        $sth->execute(array($cid));
        } while ($sth->fetchColumn() > 0);


    global $cid;
    $sth = $db->prepare('INSERT INTO Customer (CustomerID, FirstName, LastName, Address, PostalCode, City, Country, EMail, Phone) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)');
    $sth->execute(array($cid, $fname, $lname, $address, $postal, $city, $country, $email, $tel));

    do {
        global $bid;
        bid();
        $sth = $db->prepare('SELECT COUNT (BookingID) from Booking WHERE BookingID = ?');
        } while ($sth->fetchColumn() > 0);


    global $bid;
    global $cid;
    $sth = $db->prepare('INSERT INTO Booking (BookingID, Arrival, Checkout, RoomNumber, CustomerID, Breakfast, Comment, Paid) VALUES (?, ?, ?, ?, ?, ?, ?, ?)');
    $sth->execute(array($bid, $adate, $ddate, $rnum, $cid, $bkfst, $message, 'N'));


    $subject = "Your Booking";
    global $bid;
    $message = "Hi $fname,\n\nA $rtype from $ad to $dd has been booked for you.\n\nYour Booking Code is $bid.\n\nRegards.";
    mail($email, $subject, $message);


    echo 'The Booking completed successfully! Check your E-Mail for further Information.';
}

?>

... hhmmm

2 个答案:

答案 0 :(得分:2)

这是一个无限循环:

do {
    cid();
    $sth = $db->prepare("SELECT COUNT (CustomerID) from Customer WHERE CustomerID = ?");
    $sth->execute(array($cid));
} while ($sth->fetchColumn() > 0);

由于您的cid / bid()函数构造不当,您在此do()循环中使用的$cid从不更改您所做的$cid = 0在脚本的顶部。

因此循环开始,您使用CustomerID = 0准备/执行查询,使用您获取的count()结果返回一行数据。

然后循环再次滚动,你重新执行查询,使用完全相同的$ cid = 0值,所以你继续重置循环终止条件 - 你永远不会得到一个值,因为你继续查询相同的坏/无效的cid = 0。

与旧的BASIC计划差不多一样:10 GOTO 10

答案 1 :(得分:0)

现在正在运作:

<?php

$adate    = $_POST['adate'];
$ddate    = $_POST['ddate'];
$ad       = $_POST['ad'];
$dd       = $_POST['dd'];
$fname    = $_POST['fname'];
$lname    = $_POST['lname'];
$email    = $_POST['email'];
$address  = $_POST['address'];
$postal   = $_POST['postal'];
$city     = $_POST['city'];
$country  = $_POST['country'];
$tel      = $_POST['tel'];
$message  = $_POST['message'];
$price    = $_POST['price'];
$bkfst    = $_POST['bkfst'];
$rnum     = $_POST['rnum'];
$rtype    = $_POST['rtype'];
$robotest = $_POST['blnk'];
$adate    = $adate . " 20:00:00";
$ddate    = $ddate . " 13:00:00";
$cid;
$bid;

if ($robotest)
    $error = "You are a gutless robot.";

else {

    function bid()
    {
        global $bid;
        $bid = mt_rand(111111, 999999);
        if (($bid % 10) == 0) {
            $bid = $bid + 123;

        }
    }

    function cid()
    {
        global $cid;
        $cid = mt_rand(11111, 99999);
        if (($cid % 10) == 0) {
            $cid = $cid + 123;

        }
    }

    include 'connect.php';

    $sth = $db->prepare('SELECT COUNT (EMail) from Customer WHERE EMail = ?');
    $sth->execute(array($email));
    if($sth->fetchColumn() < 1){

    do {
        global $cid;
        cid();
        $sth = $db->prepare('SELECT COUNT (CustomerID) from Customer WHERE CustomerID = ?');
        $sth->execute(array($cid));
        } while ($sth->fetchColumn() > 0);

    global $cid;
    $sth = $db->prepare('INSERT INTO Customer (CustomerID, FirstName, LastName, Address, PostalCode, City, Country, EMail, Phone) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)');
    $sth->execute(array($cid, $fname, $lname, $address, $postal, $city, $country, $email, $tel));   

    }else{
    global $cid;    
    $sth = $db->prepare('SELECT CustomerID from Customer WHERE EMail = ?');
    $sth->execute(array($email));
    $id = $sth->fetch(PDO::FETCH_ASSOC);
    $cid = $id['CustomerID'];
    }

    do {
        global $bid;
        bid();
        $sth = $db->prepare('SELECT COUNT (BookingID) from Booking WHERE BookingID = ?');
        } while ($sth->fetchColumn() > 0);


    global $bid;
    global $cid;
    $booktime = date('Y-m-d H:i:s');
    $sth = $db->prepare('INSERT INTO Booking (BookingID, Arrival, Checkout, RoomNumber, CustomerID, Breakfast, Comment, Paid, BookTime, Invoice) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)');
    $sth->execute(array($bid, $adate, $ddate, $rnum, $cid, $bkfst, $message, 'N', $booktime, NULL));


    $subject = "Your Booking";
    global $bid;
    $message = "Hi $fname,\n\nA $rtype from $ad to $dd has been booked for you.\n\nYour Booking Code is $bid.\n\nMention this Code if you need to get in touch with us.\n\nRegards.";
    mail($email, $subject, $message);


    echo 'The Booking completed successfully! Check your E-Mail for further Information.';
}

?>

没有线索,如果这是最好的方法,但它工作得很好。

感谢所有提示。