2016-06-17 4 views
0

準備したステートメントが実行中に更新された値を使用していない、バインディング前に設定したステートメントを使用しています。 w3schoolsの例では更新された値を使用していたので、私はここで間違っていますか?// winnerコメントは問題のある部分です。$ assqlst2は$ pointswonの更新値を使用していません値が正しいことを確認するために、私は出力に何のエラーもありません)。MySqli prepared statmentはステートメントを実行するときに更新された変数値を使用しません

<?php 
$dbserver = ""; //database information is populated in my script, i didn't put it here because of security resons. 
$dbusername = ""; 
$dbpassword = ""; 
$dbname = ""; 
$dbrecievedPassword = $_POST['dbPassword']; 
$winnerid = intval($_POST['winnerid']); 
$winnername = $_POST['winnername']; 
$pointswon = intval($_POST['pointswon']); 
$loserid = intval($_POST['loserid']); 
$losername = $_POST['losername']; 
$pointsph = $pointswon; 
if($dbrecievedPassword != null && $dbrecievedPassword == $dbpassword) { 
    echo "PWD_OK"; 
} 
else { 
    echo "PWD_INCORRECT"; 
} 

$conn = new mysqli($dbserver,$dbusername,$dbrecievedPassword); 
mysqli_select_db($conn,$dbname); 
if($conn->connect_error) { 
    die("Connection failed: ".connect_error); 
} 
if($winnerid != null) { 
    if($sqlst = $conn->prepare("SELECT * FROM table_name WHERE uid=?")) { 
     if($assqlst2 = $conn->prepare("UPDATE table_name SET as_points=? WHERE as_uid=?")) { 
      if($sqlst3 = $conn->prepare("INSERT INTO table_name (as_uid,as_points,as_username) VALUES (?,?,?)")) { 

       $sqlst->bind_param("i",$winnerid); 
       $assqlst2->bind_param("ii",$pointswon,$winnerid); 

       $sqlst3->bind_param("iis",$winnerid,$pointswon,$winnername); 
       if($loserid != null) { 
        //winner 

        if(!$sqlst->execute()) { 
         echo $conn->error; 
        } 
        $sqlst->bind_result($b1,$b2,$b3); 
        $sqlst->fetch(); 
        $pointswon = $pointsph + intval($b3); 
        echo $pointswon." ".$winnerid; 
        if(!$assqlst2->execute()) { 
         echo $conn->error; 
        } 
        //loser 
        $winnerid = $loserid; 
        if(!$sqlst->execute()) { 
         echo $conn->error; 
        } 
        $sqlst->bind_result($c1,$c2,$c3); 
        $sqlst->fetch(); 
        $pointswon = intval($c3) - $pointsph; 
        $sqlst->close(); 
        if(!$assqlst2->execute()) { 
         echo $conn->error; 
        } 
        $assqlst2->close(); 

       }else { 
        if(!$sqlst->execute()) { 
         echo $conn->error; 
        } 
        $sqlst->bind_result($k1,$k2,$k3); 
        $sqlst->fetch(); 
        if($k1 != null) { 
         $pointswon = intval($pointsph) + intval($k3); 
         $sqlst->close(); 
         if(!$assqlst2->execute()) { 
          echo $conn->error; 
         } 
         $assqlst2->close(); 

        }else { 
         $pointswon = $pointsph; 
         $sqlst3->execute(); 
         $sqlst3->close(); 
        } 
       } 
      }else { 
       echo $conn->error; 
      } 
     }else { 
      echo $conn->error; 
     } 
    }else { 
     echo $conn->error; 
    } 

} 
?> 
+0

私はあなたがそれらをそれぞれ分離しなければならないと思います。本当にネストする必要がありますか? –

+0

@LoganWayneどういう意味ですか?どのように私は何を分離するのですか? – Warix3

答えて

0

本当にネストする必要はありますか?

クエリを再ハッシュして複数回使用することはできません。あなたがしたい場合は、ちょうどあなたがそれをしたいときにそれを呼び出す必要がありますので、あなただけの、関数内でそれを置く必要があります:

function query1($conn, $winnerid){ 

    if($sqlst = $conn->prepare("SELECT col1, col2, col3 FROM table_name WHERE uid = ?")){ 
     $sqlst->bind_param("i", $winnerid); 
     $sqlst->execute(); 
     $sqlst->bind_result($b1, $b2, $b3); 
     $sqlst->fetch(); 
     $sqlst->close(); 
    } 

    return array($b1, $b2, $b3); 

} 

function query2($conn, $pointswon, $id){ 

    if($assqlst2 = $conn->prepare("UPDATE table_name SET as_points = ? WHERE as_uid = ?")) 
     $assqlst2->bind_param("ii", $pointswon, $id); 
     $assqlst2->execute(); 
     $assqlst2->close(); 
    } 

} 

function query3($conn, $winnerid, $pointswon, $winnername){ 

    if($sqlst3 = $conn->prepare("INSERT INTO table_name (as_uid,as_points,as_username) VALUES (?,?,?)")){ 
     $sqlst3->bind_param("iis", $winnerid, $pointswon, $winnername); 
     $sqlst3->execute(); 
     $sqlst3->close(); 
    } 

} 

機能を設定した後、私たちは今、あなたが達成したいものを進めることができます。

if($winnerid != NULL){ 

    /*** WINNER UPDATE ***/ 
    list($b1, $b2, $b3) = query1($conn, $winnerid); /* CALL THE SELECT QUERY */ 

    if($loserid != NULL){ 
     $pointswon = $pointsph + intval($b3); /* POINTS GATHERED BY THE WINNER */ 
     echo $pointswon." ".$winnerid; 
    } /* END OF CONDITION $loserid IS NOT NULL */ 

    query2($conn, $pointswon, $winnerid); /* CALL THE UPDATE QUERY */ 


    /*** LOSER UPDATE ***/ 
    list($c1, $c2, $c3) = query1($conn, $loserid); /* CALL THE SELECT QUERY */ 

    $pointswon = intval($c3) - $pointsph; /* POINT GATHERED BY THE LOSER */ 

    query2($conn, $pointswon, $loserid); /* CALL THE UPDATE QUERY */ 


} /* END OF CONDITION $winnerid IS NOT NULL */ 

else { 

    list($k1, $k2, $k3) = query1($conn, $winnerid); /* CALL THE SELECT QUERY */ 

    if($k1 != null){ 

     $pointswon = intval($pointsph) + intval($k3); 

     query2($conn, $pointswon, $winnerid); /* CALL THE UPDATE QUERY */ 

    } else { 

     query3($conn, $winnerid, $pointsph, $winnername); /* CALL THE INSERT QUERY */ 

    } 

} /* END OF ELSE */ 
+0

あなたは実際には全体のコードを書いてくれました、ありがとう、私は今それを理解しています:D – Warix3

+1

*あなたはクエリを再ハッシュして複数回使用することはできません。私はあなたが望むように何度も準備されたクエリを使うことができると確信しています。 'bind_param'は変数参照に束縛されるので、変数の現在の値を期待通りに使うことになっています。 – Barmar

+0

@Barmarだから、私のコードで何が間違っているのですか? – Warix3

関連する問題