【问题标题】:Else condition won't run其他条件不会运行
【发布时间】:2013-12-27 17:56:07
【问题描述】:

我知道标题很烦人,但无论如何我要开始我的问题。我在一个有点多用途的类中创建了一个函数。我给了它一个布尔类型的参数,当然只接受“true”和“false”作为值。接下来,我通过另一个 PHP 文件调用该函数,在该文件上通过 ajax 发布数据,并通过我的 HTML 页面上的按钮调用该 ajax。让我用图表来演示一下:

我希望你已经理解了我的程序流程,现在让我们来看看代码,或者换句话说,这是我尝试过的:

HTML 页面的按钮:

document.write('<span class="pull-right" style="margin-top: -30px; margin-right: 20px;"><button id="accept_offer" class="btn btn-success" onclick="setPostOfferAcceptance(32);">Accept Offer</button></span>');

AJAX 页面:

<?php

require_once '../../Classes/MyClass.php';

$offer_id = $_POST["id"];
$acceptance = $_POST["acceptance"];

$accepted = MyClass::SetOfferAcceptance($offer_id, $acceptance);

if($accepted) $data["status"] = "success";
else $data["status"] = "error";

echo json_encode($data);

?>

MyClass 的功能:

public static function SetOfferAcceptance($offerId, $acceptance) {
    if(Utilities::IsValid($offerId) && Utilities::IsValid($acceptance)) {
        Database::OpenConnection();

        $offerId = Utilities::SafeString(Database::$databaseConnection, $offerId);
        $acceptance = Utilities::SafeString(Database::$databaseConnection, $acceptance);

        $query = "";
        if($acceptance == true) {
            $query = Database::$databaseConnection->prepare("UPDATE post_offer SET Accepted=1 WHERE Offer_ID = ?");
        } else {
            $query = Database::$databaseConnection->prepare("UPDATE post_offer SET Accepted=0 WHERE Offer_ID = ?");
        }

        $query->bind_param("i", $offerId);
        $result = $query->execute();
        Database::CloseConnection();
        if($result) return 1; else return -1;
    }
}

抱歉,最后,这是我将数据发布到 AJAX 页面的 javascript 函数:

function setPostOfferAcceptance(offer_id) {
    if($("#accept_offer").text() == "Accept Offer") {
        $.post("admin/post_offer/set_post_offer_acceptance.php", {id: offer_id, acceptance: true}, function(data){
            if(data.status == "success") {
                $("#acceptedOfferModal").modal("show");
                setTimeout(function(){ $("#acceptedOfferModal").modal("hide"); }, 2500);
                $("#accept_offer").text("Unaccept Offer");
                console.log(data.status);
            }
        }, 'json');
    } else if($("#accept_offer").text() == "Unaccept Offer") {
        $.post("admin/post_offer/set_post_offer_acceptance.php", {id: offer_id, acceptance: false}, function(data){
            if(data.status == "success") {
                $("#unacceptedOfferModal").modal("show");
                setTimeout(function(){ $("#unacceptedOfferModal").modal("hide"); }, 2500);
                $("#accept_offer").text("Accept Offer");
                console.log(data.status);
            }
        }, 'json');
    }
}

编辑:我忘了发布 JS 代码。但是我现在已经更新了。请考虑一下。谢谢。

问题在于函数SetOfferAcceptance() 永远不会运行else 条件,即如果$acceptance 不等于true

为什么?谁能指出我的错误。

谢谢。

【问题讨论】:

  • 接受是假的吗?
  • @Oriol 他应该改用什么?
  • @user689 我知道他会推荐我使用模板引擎。
  • @user1336827 我已经发布了改变接受值的 JS 代码。

标签: javascript php jquery ajax


【解决方案1】:

如果acceptance 是布尔值,则使用以下if...else,即三元组等于$acceptance === true

// In AJAX page
if ($acceptance === true) {
  $query = Database::$databaseConnection->prepare("UPDATE post_offer SET Accepted=1 WHERE Offer_ID = ?");
} else {
  $query = Database::$databaseConnection->prepare("UPDATE post_offer SET Accepted=0 WHERE Offer_ID = ?");
}

请参考:“How do the equality (== double equals) and identity (=== triple equals) comparison operators differ?

更新:

要么检查SetOfferAcceptace 中的$acceptance 值,要么将boolean 值传递给SetOfferAcceptance。以后者为例:

$offer_id = $_POST["id"];
$acceptance = false;
if (isset($_POST["acceptance"]) && $_POST["acceptance"] == 'accepted') {
  $acceptance = true;
}

$accepted = MyClass::SetOfferAcceptance($offer_id, $acceptance);

【讨论】:

  • 谢谢,但现在只有第二个条件在运行:/ 它永远不会实现。
  • @Arian 然后只有第一个条件运行。 ://
  • 默认情况下不是所有的帖子值都是字符串吗?使用类型敏感的比较永远不会是=== true。
  • @MohammadAreebSiddiqui,你能发布$_POST['acceptance']的值吗?
  • @JonathanKuhn,是的。我错过的部分并为此付出了代价:(
【解决方案2】:

谢谢大家的回答,但我想出了另一种选择。那不是将 $acceptance 设为布尔值,而是将其设为字符串并将我的 JS 代码转换为:

function setPostOfferAcceptance(offer_id) {
    if($("#accept_offer").text() == "Accept Offer") {
        $.post("admin/post_offer/set_post_offer_acceptance.php", {id: offer_id, acceptance: "accepted"}, function(data){
            if(data.status == "success") {
                $("#acceptedOfferModal").modal("show");
                setTimeout(function(){ $("#acceptedOfferModal").modal("hide"); }, 2500);
                $("#accept_offer").text("Unaccept Offer");
                console.log(data.status);
            }
        }, 'json');
    } else if($("#accept_offer").text() == "Unaccept Offer") {
        $.post("admin/post_offer/set_post_offer_acceptance.php", {id: offer_id, acceptance: "unaccepted"}, function(data){
            if(data.status == "success") {
                $("#unacceptedOfferModal").modal("show");
                setTimeout(function(){ $("#unacceptedOfferModal").modal("hide"); }, 2500);
                $("#accept_offer").text("Accept Offer");
                console.log(data.status);
            }
        }, 'json');
    }
}

而我班级的功能变成:

public static function SetOfferAcceptance($offerId, $acceptance) {
    if(Utilities::IsValid($offerId) && Utilities::IsValid($acceptance)) {
        Database::OpenConnection();

        $offerId = Utilities::SafeString(Database::$databaseConnection, $offerId);
        $acceptance = Utilities::SafeString(Database::$databaseConnection, $acceptance);

        $query = "";
        if($acceptance == "accepted") {
            $query = Database::$databaseConnection->prepare("UPDATE post_offer SET Accepted=1 WHERE Offer_ID = ?");
        } else {
            $query = Database::$databaseConnection->prepare("UPDATE post_offer SET Accepted=0 WHERE Offer_ID = ?");
        }

        $query->bind_param("i", $offerId);
        $result = $query->execute();
        Database::CloseConnection();
        if($result) return 1; else return -1;
    }
}

这很有效! :)

再次感谢@vee

【讨论】:

    【解决方案3】:

    如果我没记错的话,您的问题源于自动类型转换。

    if($result) return 1; else return -1; // both of these evaluate to boolean true because -1 is an integer
    
    if($result) return 1; else return 0; // evaluates to true/false respectively
    
    if($result) return true; else return false; // evaluates to true/false respectively
    

    最后一行是你应该诚实使用的。

    【讨论】:

    • 谢谢,但这个答案与我的问题无关,我使用1-1 是有原因的。
    • 好吧,我只是希望这个问题不会让您感到厌烦,因为if($accepted) 块将始终按照当前编写的方式评估为“成功”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多