2017-02-04 19 views
0

mysqlデータベースに問題なく挿入できますが、レコードを更新することはできません。update文が動作しません(通常の文と準備文)

最初は、結果やエラーなしでmysqli_queryを使用していました。後で私は結果のない準備文を試しました。

ダウンここに私のコードを共有:

define('DB_SERVER', 'localhost'); 
define('DB_USERNAME', 'xxxx'); 
define('DB_PASSWORD', 'xxxx'); 
define('DB_DATABASE', 'xxxx'); 
$db = mysqli_connect(DB_SERVER,DB_USERNAME,DB_PASSWORD,DB_DATABASE); 

//the function 
function SaveLineItem() { 
    $sql = "update lineitems set deliverycost=? "; 

    $tdetail = ""; 
    if($_POST['tdetail']){ 
     $sql .= ",tracking_details=?" ; 
     $tdetail = $_POST['tdetail']; 
    } 

    $sql .= " where id=?"; 

    $dc = $_POST['dc']; 
    $lineItemId = $_POST['lineItemId']; 
    echo $sql; 

    $stmt = mysqli_prepare($db, $sql); 
    echo "<br>after prepare statement"; 

    if($tdetail<>""){ 
     mysqli_stmt_bind_param($stmt,"isi",$dc1,$tdetail1,$lineItemId1); 
    }else { 
     mysqli_stmt_bind_param($stmt,"ii",$dc1,$lineItemId1); 
    } 

    echo "<br>after binding"; 

    $dc1 = $dc; 
    if($tdetail<>""){ 
     $tdetail1 = $tdetail; 
     echo "<br>detail param bound"; 
    } 

    $lineItemId1 = $lineItemId; 
    mysqli_stmt_execute($stmt); 

    echo "<br>statement executed"; 
    //header("location:../welcome.php"); 
} 

を出力は、次のとおりです。

update lineitems set deliverycost=? ,tracking_details=? where id=? 
after prepare statement 
after binding 
detail param bound 
statement executed 

しかし、更新がないテーブルをチェックするには。 昨日から試してみると、何が分からないのですか?

更新: このコードは当初Windowsで開発されましたが、後でUbuntu 16.04で作業を続けることにしました。それはubuntuでさえ挿入が機能していないようです。それはubuntuのセキュリティ関連の問題かもしれません?

+0

mysqli_stmt_affected_rowsを使用して、更新ステートメントの影響を受ける行の数を確認します。そして、正しく出力されていれば、クエリ部分からコードが失敗していない可能性があります。渡されたパラメタとその価値を確認してください。おそらく、バインディングのエラーのために、結果が更新される可能性があります。整数の '$ _POST'でintvalを使うべきである場合、おそらくあなたは整数を設定します。 –

答えて

0

お試しください。 mysqli_stmt_bind_paramで使用された時点で$dc1が未定義です。あなたのために$dc1は更新されたレコードのidを保持します。これがnullの場合、データベースに変更が表示されません。クエリは実行されますが、行には影響しません。

define('DB_SERVER', 'localhost'); 
define('DB_USERNAME', 'xxxx'); 
define('DB_PASSWORD', 'xxxx'); 
define('DB_DATABASE', 'xxxx'); 
$db = mysqli_connect(DB_SERVER,DB_USERNAME,DB_PASSWORD,DB_DATABASE); 

//the function 
function SaveLineItem() { 
    $sql = "update lineitems set deliverycost=? "; 

    $tdetail = ""; 
    if($_POST['tdetail']){ 
     $sql .= ",tracking_details=?" ; 
     $tdetail = $_POST['tdetail']; 
    } 

    $sql .= " where id=?"; 

    $dc = intval($_POST['dc']); 
    $lineItemId = intval($_POST['lineItemId']); 
    echo $sql; 
    $stmt = mysqli_prepare($db, $sql); 
    echo "<br>after prepare statement"; 
    // define $dc1 here since you use it below. If it is undefined could resolve to an error or a wrong query. 
    $dc1 = $dc;  
    if($tdetail<>""){ 
     mysqli_stmt_bind_param($stmt,"isi",$dc1,$tdetail1,$lineItemId1); 
    }else { 
     mysqli_stmt_bind_param($stmt,"ii",$dc1,$lineItemId1); 
    } 

    echo "<br>after binding"; 


    if($tdetail<>""){ 
     $tdetail1 = $tdetail; 
     echo "<br>detail param bound"; 
    } 

    $lineItemId1 = $lineItemId; 
    mysqli_stmt_execute($stmt); 

    echo "<br>statement executed"; 
    mysqli_stmt_close($stmt); 
    echo "<br>statement closed"; 
    //header("location:../welcome.php"); 
} 
0

executeステートメントを変数に入れて、最後にエコーして、クエリが失敗するかどうかを確認してください。

次に、クエリの出力をphpmyadminに入れて、エラーがあるかどうかを確認してください。

+0

同じコードがWindows 10で期待通りに挿入され、更新されます。最近、私はUbuntuを16.04にアップグレードしました。この問題にubuntuタグを追加する。 –