Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在一个process.php文件中提交第二个查询之前,如何查询SQL数据库?_Php_Mysql - Fatal编程技术网

在一个process.php文件中提交第二个查询之前,如何查询SQL数据库?

在一个process.php文件中提交第二个查询之前,如何查询SQL数据库?,php,mysql,Php,Mysql,我有一个进程预订脚本,它从HTML预订表单中获取信息并将其发送到mySQL关系数据库 它工作得很好,但是我修改了代码,以便第一次查询检查他们选择的房间是否在指定的日期范围内的任何时间预订。这可以在第一个查询$q中看到 如果已经在用户提交该房间的任何一天预订了,脚本应该回显一个错误,否则它应该启动mysqli_多查询并提交数据 这两个查询都直接在sql中工作,但是我很难弄清楚为什么初始if语句不工作--“if(mysqli_num_rows($result)==0)” 以下是PHP文件: ****

我有一个进程预订脚本,它从HTML预订表单中获取信息并将其发送到mySQL关系数据库

它工作得很好,但是我修改了代码,以便第一次查询检查他们选择的房间是否在指定的日期范围内的任何时间预订。这可以在第一个查询$q中看到

如果已经在用户提交该房间的任何一天预订了,脚本应该回显一个错误,否则它应该启动mysqli_多查询并提交数据

这两个查询都直接在sql中工作,但是我很难弄清楚为什么初始if语句不工作--“if(mysqli_num_rows($result)==0)”

以下是PHP文件:

********编辑**********

当我提交一个已经为请求的日期范围预先预订的房间的预订时,它将被提交,而不是重复else语句中的内容

以下是错误消息:

********编辑二**********

修正!问题在于一个错误的查询

<html>



<body>

    <?php

        $page_title = 'Process Booking Form';

        require 'login-db.php';   //  require once means that it well generate a fatal error if the file is not found and means that the file will only be read in when it has not previously been inclued which prevents wastefule duplicate disk accesses.

         $dbc = new mysqli($hn, $un, $pw, $db);



        if($dbc->connect_error) {

           die ($dbc->connect_error);

        }



        if(isset($_POST['firstname']) &&

           isset($_POST['lastname']) &&

           isset($_POST['datefrom']) &&

           isset($_POST['dateto']) &&

           isset($_POST['specialevent']) &&

           isset($_POST['roomnumber']))

        {

            $firstname     = secure_post($dbc, 'firstname');

            $lastname      = secure_post($dbc, 'lastname');   //security

            $datefrom      = secure_post($dbc, 'datefrom');

            $dateto        = secure_post($dbc, 'dateto');

            $specialevent  = clean_string($dbc, 'specialevent');

            $roomno        = secure_post($dbc, 'roomnumber');



                //validation



                $error_message = "";



                if(strlen($firstname) < 2 || strlen($firstname) > 20) {

                    $error_message .= 'Your first name does not appear to be valid.<br>';

                }



                if(strlen($lastname) < 2 || strlen($lastname) > 30) {

                    $error_message .= 'Your last name does not appear to be valid.<br>';

                }



                if(strlen($error_message) > 0) {

                    die($error_message);

                }


                //Query to find out if user selected dates are already booked for their chosen room
                $q = "SELECT customerinfo.firstname, customerinfo.lastname, roominfo.roomnumber, roominfo.roomsize, roominfo.roomprice, bookings.datefrom, bookings.dateto, bookings.daterange

                FROM customerinfo

                LEFT JOIN bookings ON bookings.customer_id = customerinfo.customer_id

                LEFT JOIN transactions ON customerinfo.customer_id = transactions.customer_id

                LEFT JOIN transactionsdetails ON transactionsdetails.transactions_id = transactions.transactions_id

                LEFT JOIN roominfo ON transactionsdetails.room_id = roominfo.room_id

                WHERE roomnumber = $roomno

                AND (bookings.datefrom BETWEEN $datefrom AND $dateto)

                OR (roomnumber = $roomno

                AND (bookings.dateto BETWEEN $datefrom AND $dateto))";

                $result = mysqli_query($dbc, $q);

                // $checkdates = mysqli_query($dbc, $checkdatessql);

                if(mysqli_num_rows($result) == 0) {

                        //echo confirmation message to user
                        echo "Hello $firstname, your booking has been requested for room: $roomno. Your check-in date and time is $datefrom at 11:00am and your scheduled checkout date and time is $dateto at 15:00pm. Thank you for choosing to stay at Westworld.";

                        //submit customer information to the database
                        mysqli_multi_query($dbc,

                         "INSERT INTO customerinfo(firstname, lastname, specialevent) VALUES ('$firstname','$lastname','$specialevent');

                        SET @cusID := LAST_INSERT_ID();

                        INSERT INTO bookings(dateto, datefrom, daterange, customer_id) VALUES ('$dateto','$datefrom',DATEDIFF(dateto,datefrom), @cusID);

                        INSERT INTO transactions (customer_id, datebooked) VALUES (@cusID, CURDATE());

                         SET @roomID := (SELECT room_id FROM roominfo WHERE roomnumber = '$roomno');

                        INSERT INTO transactionsdetails (transactions_id, room_id) VALUES (LAST_INSERT_ID(), @roomID);");
                } else {
                  //echo room error message
                  echo "The room you have selected is unavailable in that date range.";
                }


            $r->close();

            $dbc->close();


        };



        function secure_post($dbc, $string) {

            return htmlentities($dbc->real_escape_string($_POST[$string]));

        } 



        function clean_string($dbc, $string) {

            if (get_magic_quotes_gpc())  $string = stripslashes($string);

            return htmlentities($dbc->real_escape_string($_POST[$string]));

        }


    ?>



</body>

好吧,添加一个“print_r(mysqli_num_rows($result));”并查看结果。它可能会返回一个字符串,如文档中所述。我不知道您在$datefrom和其他变量中使用了什么,您在查询中使用这些变量时没有任何转义(),但是当它是有效日期('yyy-MM-DD')时,您需要转义它

不管是什么,你都应该改用PDO。在那里,您可以使用准备好的语句,让PDO为您映射变量(您仍然编写相同的SQL命令,但不是“$test”,而是编写“:test”,然后说“:test应该被$test替换,它是一个字符串”)。更安全,公司不会当场解雇你;)


下次尝试保持代码简单,比如一个简单的select查询,然后是mysqli_num_行,然后是一个返回,其他什么都不做。不要发布超出人们理解您的问题所需的内容。

您所说的“不起作用”是什么意思?警告:使用
mysqli
时,您应该使用并将用户数据添加到查询中。不要使用字符串插值或串联来完成此操作,因为您已经创建了严重的错误。切勿将
$\u POST
$\u GET
或任何用户数据直接放入查询中,如果有人试图利用您的错误,这可能会非常有害
htmlentities
不是正确的SQL转义方法。警告:避免使用
mysqli\u multi\u query
,因为它本身不安全,不支持存储过程。在继续之前,您需要确保提交的每个语句都成功,如果其中一个语句失败,您通常需要退出、还原事务、显示用户错误或以上所有操作。注意:
mysqli
的面向对象界面明显不太冗长,使代码更易于阅读和审核,并且不容易与过时的
mysql\u查询
接口混淆。在你对程序性风格投入太多之前,值得换一种。示例:
$db=new mysqli(…)
$db->prepare(“…”)
过程接口是PHP 4时代的产物,当时引入了
mysqli
API,不应在新代码中使用。警告:编写自己的访问控制层并不容易,而且有很多机会使它严重出错。请不要编写您自己的身份验证系统,因为任何现代的同类产品都具有强大的内置功能。至少要遵循并永远不要将密码存储为纯文本或弱散列(如SHA1或MD5)。