PHP多个查询没有导致数据库

时间:2018-01-14 14:09:41

标签: php mysql

我正在开发一款需要连接数据库的Android应用程序。我有android部分工作,但我的PHP脚本有问题。

<?php
$con = mysqli_connect(/This info is correct/) or die ("Unable to connect");

$gebruikersnaamOntvanger = $_POST["gebruikersnaamOntvanger"];
$idBetaler = $_POST["idBetaler"];
$bedrag = $_POST["bedrag"];
$saldoBetaler = $_POST["saldo"];
$response = array();
$response["success"] = "false";

$statement = mysqli_prepare($con, "SELECT idGebruiker, Saldo FROM Gebruikers WHERE Gebruikersnaam = ?");
mysqli_stmt_bind_param($statement, "s", $gebruikersnaamOntvanger);
mysqli_stmt_execute($statement);

mysqli_stmt_store_result($statement);
mysqli_stmt_bind_result($statement, $idGebruiker, $Saldo);

while($row = mysqli_stmt_fetch($statement)){
    $idOntvanger = $idGebruiker;  
    $saldoOntvanger = $Saldo;
}

$saldoOntvanger += $bedrag;
$saldoBetaler -= $bedrag;


try {

    $statement2 = mysqli_prepare($con, "INSERT INTO Transacties (idBetaler, idOntvanger, Bedrag, Datum, Uitgevoerd) VALUES(?, ?, ?, now(), 1)");
    mysqli_stmt_bind_param($statement2, "iid", $idBetaler, $idOntvanger, $bedrag);  
    mysqli_stmt_execute($statement2);

    $response["success"] = "success";

} catch(Exception $e) {
    $response["success"] = $e->gettext;
}


echo json_encode($response);
 ?>

因此android部分正常工作并正确返回JSON对象,但数据库中没有任何变化。我尝试添加一个try catch,所以我得到的是错误,但try catch永远不会有效。脚本alwayws即使不起作用也会返回成功。请注意我是PHP新手,我已经仔细检查了SQL查询,它们应该是正确的。如果您需要更多信息,请询问。

2 个答案:

答案 0 :(得分:0)

我认为问题是在插入查询的绑定中使用iid。它应该是iisiii。您尝试使用try/catch块,但在我看来并没有充分利用它们 - 应该测试prepared statement的创建,看它是成功还是失败〜其结果可以用于try/catch逻辑表示错误。请原谅proceduralOOP样式代码

的混合
<?php
    if( $_SERVER['REQUEST_METHOD']=='POST' && isset( $_POST["gebruikersnaamOntvanger"], $_POST["idBetaler"], $_POST["bedrag"], $_POST["saldo"] ) ){

        try{

            $con = mysqli_connect(/This info is correct/) or die ("Unable to connect");

            $gebruikersnaamOntvanger = $_POST["gebruikersnaamOntvanger"];
            $idBetaler = $_POST["idBetaler"];
            $bedrag = $_POST["bedrag"];
            $saldoBetaler = $_POST["saldo"];

            $response = array('success'=>false);

            $stmt=$conn->prepare( 'select `idgebruiker`, `saldo` from `gebruikers` where `gebruikersnaam` = ?' );
            if( !$stmt ) throw new Exception('unable to prepare select query');
            else {

                $stmt->bind_param( 's', $gebruikersnaamOntvanger );
                $result=$stmt->execute();
                if( !$result )throw new Exception('No results from select query');
                else {

                    $stmt->store_result();
                    $stmt->bind_result( $idGebruiker, $Saldo );

                    while( $stmt->fetch() ){
                        $idOntvanger = $idGebruiker;  
                        $saldoOntvanger = $Saldo;                       
                    }

                    $saldoOntvanger += $bedrag;
                    $saldoBetaler -= $bedrag;                   


                    $stmt=$con->prepare('insert into `transacties` ( `idbetaler`, `idontvanger`, `bedrag`, `datum`, `uitgevoerd` ) values(?, ?, ?, now(), 1)');
                    if( !$stmt )throw new Exception('Unable to prepare insert query');
                    else {

                        /* What is the value of $bedrag? integer, string?? */
                        /*
                            The binding iid was incorrect - perhaps iis or iii
                        */
                        $stmt->bind_param('iis', $idBetaler, $idOntvanger, $bedrag );
                        $result = $stmt->execute();
                        $response['success']=$result;

                    }
                }
            }

            echo json_encode( $response );

        }catch( Exception $e ){
            echo $e->getMessage();
        }
    }
?>

答案 1 :(得分:0)

mysqli_ *函数不会抛出异常。所以即使出错也不会执行你的捕获。像这样更改你的代码:

if(!mysqli_stmt_execute($statement2))
         throw new Exception(mysqli_stmt_error($statement2));

当您看到错误时,您可以修复代码。可以向mysqli_prepare和其他人添加相同的错误处理