PHP中if-else语句故障的一个奇怪例子

PHP中if-else语句故障的一个奇怪例子,php,if-statement,pdo,Php,If Statement,Pdo,我已经研究这个问题几个小时了,真的希望我没有遗漏任何基本的东西。我知道它的大部分代码,但所有信息都在代码中的注释中 我有一个在我的案例中输入的函数: $db是具有访问凭据的阵列 $uid在本例中为空 $email是一个有效的电子邮件地址 $companyid是一个有效的特定数值,与此无关 $fname、$lname、$mname、$role-有效字符串 现在函数本身: function hire_employee($db, $uid, $email, $companyid, $fname, $l

我已经研究这个问题几个小时了,真的希望我没有遗漏任何基本的东西。我知道它的大部分代码,但所有信息都在代码中的注释中

我有一个在我的案例中输入的函数: $db是具有访问凭据的阵列 $uid在本例中为空 $email是一个有效的电子邮件地址 $companyid是一个有效的特定数值,与此无关 $fname、$lname、$mname、$role-有效字符串

现在函数本身:

function hire_employee($db, $uid, $email, $companyid, $fname, $lname, $mname, $role){
    try{    
        $srvr = new PDO("mysql:host=".$db['server'].";dbname=".$db['db'], $db['mysql_login'], $db['mysql_pass'], array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'));
        $srvr->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        if (is_numeric($uid)){ //uid is null in our case, so we skip this piece of code
            echo "<br>trace 1";//does not output
            $set=$srvr->prepare("INSERT into roles (uid, companyid, role, assigned_date) VALUES ((SELECT uid FROM users WHERE uid=:uid and active=1), :companyid, :role, CURDATE());");
            $set->bindParam(":uid", $uid);
            $set->bindParam(":companyid", $companyid);
            $set->bindParam(":role", $role);
            if ($set->execute()){
                return true;
            }
        } elseif (isset($email)) {// this is our case, we have a valid email
            echo "<br>trace 2";//does output
            $email = filter_var($email, FILTER_SANITIZE_EMAIL);
            if (!filter_var($email, FILTER_VALIDATE_EMAIL) === false) {
                //is a valid email address
                //first trying to add existing user (if exists)
                echo "<br>trace 2.1";//does output
                $check=$srvr->prepare("INSERT into roles (uid, companyid, role, assigned_date) VALUES ((SELECT uid FROM users WHERE email=:email and active=1), :companyid, :role, CURDATE());");
                $check->bindParam(":companyid", $companyid);
                $check->bindParam(":role", $role);
                $check->bindParam(":email", $email);
                //NOW THE WEIRD PART!!!-----------------------
                if ($check->execute()){//checking if statement executes successfully and returns true
                    echo "<br>trace 2.1.1";//does not output, a proper thing in our case
                    return true;
                } else { //nope user does not exist, we need to create a user
                    echo "<br>trace 2.1.2";//this does not output either!!!
                    //dear stackoverflow member can skip the rest of the code below
                    echo "<br>traceYO!!! $uid, $email, $companyid, $fname, $lname, $mname, $role";
                    $newuserid=register_user($db, $fname, $mname, $lname, "NULL", "NULL", "NULL", "NULL", true, $email, "NULL");
                    echo $newuserid;
                    if (!is_numeric($newuserid) AND ($newuserif > 0)) {
                        echo "<br>trace 2.1.2.1";
                        return false;
                    } else {
                        echo "<br>trace 2.1.2.2";
                        $insert=$srvr->prepare("INSERT into roles (uid, companyid, role, assigned_date) VALUES (:uid, :companyid, :role, CURDATE());");
                        $insert->bindParam(":uid", $newuserid);
                        $insert->bindParam(":companyid", $companyid);
                        $insert->bindParam(":role", $role);
                        if ($insert->execute()){
                            echo "<br>trace 2.1.2.2.1";
                            return true;
                        }
                    }
                }
            } else {
                //is not a valid email address
                return false;
            }
        } else { 
            echo "<br>trace 3";
            return false;
        }

    }
    catch(PDOException $e) {
        report_error($db, $_SESSION['uid'], $companyid, 'hire_employee', "companyid: $companyid, fname: $fname, mname: $mname, lname: $lname, email: $email, uid: $uid, role:$role", $e->getMessage());
        return false;
    }
}
现在我得到的唯一输出是:

踪迹2 跟踪2.1

不知何故,它无法跟踪2.1.1或2.1.2

任何帮助都将不胜感激。

我得到了。这一行if$check->execute生成了错误异常,该异常立即得到了CAUHGT,从而阻止了函数的进一步执行。事实上,我看到错误被添加到我想要的地方,然而,作为一个有例外的noob,我并没有把二和二放在一起。我将ATTR_ERRMODE更改为PDO::ERRMODE_WARNING,它似乎工作正常。我得到一个警告,execute没有返回true,函数按预期运行

如果有人教我如何捕捉警告,我会非常感激

无论如何,谢谢大家

UPD_1:
允许生成任何警告是一种非常糟糕的做法,我正在相应地调整函数和/或语句。

是否检查了错误日志?尝试将此问题简化为一个更简单的问题。这太多的代码无法转储。很可能是准备或执行崩溃。@RWS最好只发布相关代码。要意识到,人们可能只看了你的问题几秒钟就决定是否值得花时间。如果你的问题有一半是一堆代码,那么很多人会认为这不值得。另外,在试图减少代码的同时解决问题是很常见的。也许准备失败了?在准备之后尝试回显,并检查错误。您不应该捕获警告。两者都不应使用PDO::ERRMODE_WARNING@YourCommonSense我非常同意,我正在重新考虑整个函数和/或语句。