为什么 PHP PDO bindParam return null if include jQuery file

Why PHP PDO bindParam return null if include jQuery file

在每个页面上,我都有 jQuery 模态,其中包含一个联系表单,并且在每个页面上都需要将数据发送到不同的电子邮件地址。提交表单时,我需要使用 json_encode 显示成功的响应。同样在每个页面上,我都使用页面标识符 $pages_id=1$pages_id=2 等来标识提交的表单。然而,非常重要的是,在没有 jQuery 文件的情况下,完成我的 PHP 代码它被正确执行,所有数据都成功插入数据库并且在 Xdebug 中我也看到它成功执行的每一行代码。但是,如果我包含 jQuery 文件,那么在 Xdebug 中 $pages_id return 的值为 null。我正是在这行代码中思考:

$query = "SELECT owners_email.email_address_id, email_address, owner_name, owner_property, owner_sex, owner_type FROM visitneum.owners_email INNER JOIN visitneum.pages ON (pages.email_address_id = owners_email.email_address_id) WHERE `owner_sex`='M' AND `owner_type`='other' AND `pages_id` = ?";
$dbstmt = $pdo->prepare($query);
$dbstmt->bindParam(1,$pages_id);
$dbstmt->execute();

但是,下面是我的完整 PHP 代码:

<?php
// set error reporting
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL | E_STRICT);

$fname = $tel = $userMail = $userMessage = $email_address_id = "";
$fname_error = $tel_error = $userMail_error = $userMessage_error = "";
$error=false;
//Load the config file
$dbHost = "secret";
$dbUser = "secret";
$dbPassword = "secret";
$dbName = "secret";
$dbCharset = "utf8";
$pdo="";
try{
    $dsn = "mysql:host=" . $dbHost . ";dbName=" . $dbName . ";charset=" . $dbCharset;
    $pdo = new PDO($dsn, $dbUser, $dbPassword);
    array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8");
    $pdo->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
}catch(PDOException $e){
    echo "Connection error: " . $e->getMessage();
}
use PHPMailer\PHPMailer\PHPMailer;
require 'PHPMailer/PHPMailer.php';
require 'PHPMailer/SMTP.php';
require 'PHPMailer/Exception.php';
if($_SERVER['REQUEST_METHOD'] == 'POST'){
if(isset($_POST['submitOwner'])){
    $fname = $_POST['fname'];
    $tel = $_POST['tel'];
    $userMail = $_POST['userMail'];
    $userMessage = $_POST['userMessage'];
if(empty($_POST['fname'])){
        $error=true;
        $fname_error = "Name and surname cannot be empty!";
    }else{
        $fname = $_POST['fname'];   
        if(!preg_match("/^[a-zšđčćžA-ZŠĐČĆŽ\s]*$/", $fname)){
            $fname_error = "Name and surname can only contain letters and spaces!";
        }
    }
    if(empty($_POST['tel'])) {
        $tel_error = "Phone number cannot be blank!";
    }else{
        $tel = $_POST['tel'];
        if(!preg_match('/^[\+]?[0-9]{9,15}$/', $tel)) {
            $tel_error = "The phone number should contain a minimum of 9 to 15 numbers!";
        }
    }
if(empty($_POST['userMail'])){
        $userMail_error = "Email cannot be blank!";
    }else{
        $userMail = $_POST['userMail'];
        if(!filter_var($userMail, FILTER_VALIDATE_EMAIL)) {
            $userMail_error = "Email address is incorrect!";
        }
    }
    if(empty($_POST['userMessage'])) {
        $userMessage_error = "The content of the message cannot be empty!";
    }else{
        $userMessage = $_POST['userMessage'];
        if(!preg_match("/^[a-zšđčćžA-ZŠĐČĆŽ0-9 ,.!?\'\"]*$/", $userMessage)){
            $userMessage_error = "The content of the message cannot be special characters!";
        }
    }
if($fname_error == '' && $tel_error == '' && $userMail_error == '' && $userMessage_error == ''){
    $mail = new PHPMailer(true);
    $mail->CharSet = "UTF-8";
    $mail->isSMTP();
    $mail->Host = 'secret';
    $mail->SMTPAuth = true;
    $mail->Username = 'secret';
    $mail->Password = 'secret';
    $mail->Port = 465; // 587
    $mail->SMTPSecure = 'ssl'; // tls
    $mail->WordWrap = 50;  
    $mail->setFrom('secret@secret.com');
    $mail->Subject = "New message from visit-neum.com";
    $mail->isHTML(true);
    $query = "SELECT owners_email.email_address_id, email_address, owner_name, owner_property, owner_sex, owner_type FROM visitneum.owners_email INNER JOIN visitneum.pages ON (pages.email_address_id = owners_email.email_address_id) WHERE `owner_sex`='M' AND `owner_type`='other' AND `pages_id` = ?";
$dbstmt = $pdo->prepare($query);
$dbstmt->bindParam(1,$pages_id); 
$dbstmt->execute(); //in Xdebug this line of code return NULL for $pages_id if include jQuery file
$emails_other = $dbstmt->fetchAll(PDO::FETCH_ASSOC);
$jsonData=array();
    if(is_array($emails_other) && count($emails_other)>0){
      foreach($emails_other as $email_other){
        //var_dump($email_other['email_address']);
        $mail->addAddress($email_other['email_address']);
        $body_other = "<p>Dear {$email_other['owner_name']}, <br>" . "You just received a message from the site <a href='https://www.visit-neum.com'>visit-neum.com</a><br>Details of your message are below:</p><p><strong>From: </strong>" . ucwords($fname) . "<br><strong>Phone: </strong>" . $tel . "<br><strong>E-mail: </strong>" .strtolower($userMail)."<br><strong>Message: </strong>" . $userMessage . "</p>";
$mail->Body = $body_other;
if($mail->send()){
            
            $mail = "INSERT INTO visitneum.contact_owner(fname, tel, userMail, userMessage, email_address_id) VALUES(:fname, :tel, :userMail, :userMessage, :email_address_id)";
            $stmt = $pdo->prepare($mail);
            $stmt->execute(['fname' => $fname, 'tel' => $tel, 'userMail' => $userMail, 'userMessage' => $userMessage, 'email_address_id' => $email_other['email_address_id']]);

                // Load AJAX
                if($error==false){
                    $information['response'] = "success";
                    $information['content'] = "Thanks " . ucwords($fname) . "! Your message has been successfully sent to the owner of property! You will get an answer soon!";
                    $jsonData[] = $information;
                }
}//end if mail send         
else{   
    $information['response'] = "error";
    $information['content'] = "An error has occurred! Please try again..." . $mail->ErrorInfo;
    $jsonData[]=$information;  
}
echo(json_encode($jsonData));
} // end foreach($emails_other as $email_other)
} // end if(is_array($emails_other) && count($emails_other)>0)
} // end if validation
} // end submitOwner
} // end REQUEST METHOD = POST

在下面你可以看到我的 jQuery 文件的 submitHandler 导致了我的问题:

 submitHandler: function(form){  
      var formData=jQuery("#contactOwner").serialize();
      console.log(formData);
      jQuery.ajax({
        url: "/inc/FormProcess.php",
        type: "post",
        dataType: "json",
        data: formData,
      success:function(jsonData) {
         jQuery("#responseOwner").text(jsonData.content);
         console.log(jsonData);
      error: function (jqXHR, textStatus, errorThrown) {
                    console.log(JSON.stringify(jqXHR));
                    console.log("AJAX error: " + textStatus + ' : ' + errorThrown);
                  }
      }); // Code for AJAX Ends
// Clear all data after submit
      var resetForm = document.getElementById('contactOwner').reset();
      return false;
    } // end submitHandler

包含联系表格的页面如下:

<?php
include_once './inc/FormProcess.php';
?>
<form  spellcheck="false" autocomplete="off" autocorrect="off" id='contactOwner' class='form' name='contactOwner' action='' method='POST'>
<h4 id="responseOwner" class="success">
<!-- This will hold response from the server --></h4>
  <fieldset>
    <legend>Vaši podaci</legend>
        <div class="form-control halb InputIconBg"><input minlength="6" type="text" class="input username" name="fname" placeholder="Your name and surname ..." value="<?php echo Input::get('fname'); ?>"><i class="fas fa-user" aria-hidden="true"></i><span class="error"><?=$fname_error; ?></span></div><!-- end .form-control -->
            
        <div class="form-control halb InputIconBg"><input minlength="9" type="text" class="input phone" name="tel" placeholder="Your phone number..." value="<?php echo Input::get('tel'); ?>"><i class="fas fa-phone-alt" aria-hidden="true"></i><span class="error"><?=$tel_error; ?></span></div><!-- end .form-control -->

        <div class="form-control single InputIconBg"><input type="text" class="input mail" name="userMail" placeholder="Your e-mail..." value="<?php echo Input::get('userMail'); ?>" autocomplete="email"><i id="" class="fas fa-envelope owner_icon" aria-hidden="true"></i><span class="error"><?=$userMail_error; ?></span></div><!-- end .form-control --> 
            
        <div class="form-control InputIconBg"><textarea maxlength="1000" name="userMessage" class="textinput message" cols="46" rows="8" placeholder="Your message..."><?php echo Input::get('userMessage'); ?></textarea><i class="fas fa-pencil-alt owner_icon" aria-hidden="true"></i><span class="error"><?=$userMessage_error; ?></span></div><!-- end .form-control -->
            
    </fieldset>
    <input type="submit" class="btn_submit" id="submitOwner" name="submitOwner" value="SENT"/>
</form>
<script defer src="/JS/validateOwner.js"></script>

所以,我无法弄清楚问题是什么以及为什么在包含 jQuery 文件时 $pages_id return 为空。另外,我忘记提到第 0 行 if(is_array($emails_other) && count($emails_other)>0){ return 内的代码,因此没有执行完整的连续代码,但这当然是正常的,因为 $pages_id 为空。但是,我希望有人明白问题出在哪里,因此,在此先感谢您能给我的任何帮助。

page_id 在您的脚本中为空,因为您没有在脚本中设置它。

那么,为什么不直接在带有页面 ID 的 froms 中添加一个隐藏的输入字段,然后在 PHP 代码中添加一个隐藏的输入字段

$page_id = $_POST['pageId'];


我认为您没有理解 ajax 正确。如果你 post 你的数据到 /inc/FormProcess.php 它不像以前的包含,你可以先创建变量然后包含它。 AJax 就像对脚本的子调用。就像您只打开 URL 中提供的这个脚本一样。所以此时你没有变量。

您需要获取变量或发送您的 ajax 请求而不是 /inc/FormProcess.php 而是发送到您定义变量的脚本

你所要做的就是在表单末尾添加隐藏的输入类型,所以我的正确表单应该是这样的:

<form  spellcheck="false" autocomplete="off" autocorrect="off" id='contactOwner' class='form ajax' name='contactOwner' action='' method='POST'>
<h4 id="responseOwner" class="success">
<!-- This will hold response from the server --></h4>
  <fieldset>
    <legend>Vaši podaci</legend>
        <div class="form-control halb InputIconBg"><input minlength="6" type="text" class="input username" name="fname" placeholder="Vaše ime i prezime..." value="<?php echo Input::get('fname'); ?>"><i class="fas fa-user" aria-hidden="true"></i><span class="error"><?=$fname_error; ?></span></div><!-- end .form-control -->
            
        <div class="form-control halb InputIconBg"><input minlength="9" type="text" class="input phone" name="tel" placeholder="Vaš broj telefona..." value="<?php echo Input::get('tel'); ?>"><i class="fas fa-phone-alt" aria-hidden="true"></i><span class="error"><?=$tel_error; ?></span></div><!-- end .form-control -->

        <div class="form-control single InputIconBg"><input type="text" class="input mail" name="userMail" placeholder="Vaš e-mail..." value="<?php echo Input::get('userMail'); ?>" autocomplete="email"><i id="" class="fas fa-envelope" aria-hidden="true"></i><span class="error"><?=$userMail_error; ?></span></div><!-- end .form-control --> 
            
        <div class="form-control InputIconBg"><textarea maxlength="1000" name="userMessage" class="textinput message" cols="46" rows="8" placeholder="Vaša poruka..."><?php echo Input::get('userMessage'); ?></textarea><i class="fas fa-pencil-alt owner_icon" aria-hidden="true"></i><span class="error"><?=$userMessage_error; ?></span></div><!-- end .form-control -->
            
    </fieldset>
    <input type="hidden" name="pages_id" value="<?=$pages_id?>">
    <input type="submit" class="btn_submit" id="submitOwner" name="submitOwner" value="POŠALJI"/>
</form>