簡體   English   中英

如果滿足 php 條件,如何使用 PDO 准備好的語句

[英]How to use PDO prepared statement if php condition is met

如果基於 POST 數據滿足條件,我正在嘗試執行 sql 語句。 附件是打印數組的屏幕截圖的鏈接,以及它應該查詢的表。 我沒有收到錯誤,但是如果數據確實 = 1,數據庫中什么也沒有發生,這應該運行 stmt 並根據需要刪除/添加,而是每次都會觸發 else 語句。 我現在也只是得到一個空白的 html 頁面,print_r 和 echos 沒有運行。 仍然沒有錯誤....下面的代碼,謝謝。 (連接信息由於明顯的原因被隱藏) https://imgur.com/a/BsnX2hJ

<html>
<head>
    <title>Addition Logic</title>
    
</head>
<body>

    <?php
    $db_host = "host";
    $db_username = "username";
    $db_pass = "pass";
    $db_name = "name";
    $pdo = new PDO('mysql:host='.$db_host.';dbname='.$db_name,$db_username,$db_pass);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    $sql = "INSERT INTO product
        SELECT new_prod_id, name, company, image FROM add_new_product WHERE new_prod_ID = '".$key."'
        DELETE FROM add_new_product WHERE id = '".$key."';";
    $stmt = $pdo->prepare($sql);

    print_r($_POST);
        foreach($_POST as $data)
        $key = key($data);
        echo $key;
        $user_ID = "select user_ID from add_new_product where new_prod_ID ='".$key."' ";
        echo $user_ID;
        $username = "select username from users where usersID ='".$user_ID."' ";
        echo $username;
        $user_email = "select email from users where usersID = '".$user_ID."' ";
        echo $user_email;

        if ($data == "1"){
        $stmt->execute();
        echo "Data was 1";
        }
        else{
            $msg = "Hello '".$username."', you recently submitted a product to 4UM. We regret to inform you that your product was not approved, likely because of insufficent proof uploaded \nIf this was not accurate,
            please resubmit your product with improved proof so we may approve it. \nThank you for using 4UM!";
            $msg = wordwrap($msg,70);
            mail($user_email, "4UM New Product Rejection",$msg);
        }


    ?>
     
</body> 
</html>

為什么你總是看到你的 else 語句執行的主要問題是因為你在你的foreach上省略了大括號。 雖然這是有效代碼,但它只會將下一條語句作為循環的一部分執行,而不會執行下面的其他語句。 這意味着您的代碼實際上正在執行以下操作:

foreach($_POST as $data) {
    $key = key($data);
}
echo $key;
$user_ID = "select user_ID from add_new_product where new_prod_ID ='".$key."' ";
echo $user_ID;
...

這意味着在評估if條件時, $data將設置為迭代中的最后一個值,在本例中為索引 26,值為 0。

即使您確實添加了大括號,我也不確定您希望您的代碼如何作為key僅適用於 arrays 並“返回當前數組位置的索引元素”,但是,您正在迭代您的$_POST根據您的屏幕截圖,該數組僅包含int作為值。 這意味着您的循環將嘗試key(1)key(1)key(0)

如果您正在尋找值的索引,您可以使用以下$index將是索引:

foreach($_POST as $index => $data) {
    ...

假設您修復了上述問題,您的代碼應該類似於:

print_r($_POST);
foreach($_POST as $index => $data) {
    ...

    if ($data == 1) {
        $stmt->execute();
        echo "Data was 1";
    } else {
        ...
    }
}

此外,您正在使用准備好的語句,但使用字符串連接插入$key的值,這可能會使您面臨 SQLi 攻擊,您應該改用bindParam 如果$key打算成為你的foreach中設置的值,你可以在循環中execute之前使用bindParam

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM