0

テーブルの特定の行を更新する更新関数があります。SQLクエリはPHPmyadminで機能し、関数では常にtrueが返されます。ただし、データベースは更新されません。コードを調べましたが、何も問題はありません。何が問題なのか。primary_idはテーブルのプライマリIDであり、他の列は。のみですfund_max

function change_fund_max ($mysqli, $project_id, $fund_max) {

if ($stmt = $mysqli->prepare("UPDATE `project_fund_max` SET `fund_max` = ? WHERE 
    `project_id` = ?")){
    $stmt->bind_param('ii', $project_id, $fund_max);
    $return = $stmt->execute();
    $stmt->close();
    return $return;
} else {return false;}      

}

これが関数の使用法です。

$fund_max = 11.55;
$project_id = 1;
$row43 =  change_fund_max ($mysqli, $project_id, $fund_max);
var_dump($row43);
4

3 に答える 3

3

Execute は失敗falseした場合にのみ戻ります... SQL を台無しにした場合などです。本当に知りたいのは、コマンドが実際に行を更新したかどうかです...変更された行が0行以上あるかどうかを確認してください。mysqli_stmt_affected_rows

また、あなたproject_idfund_maxパラメーターはあなたの中で間違った方法bindです;)

結果:

function change_fund_max ($mysqli, $project_id, $fund_max) {
  if ($stmt = $mysqli->prepare("UPDATE `project_fund_max` SET `fund_max`=? WHERE 
     `project_id` = ?")){
     $stmt->bind_param('di', $fund_max, $project_id);
     if (!$stmt->execute()) return false;
     $count=$stmt->affected_rows;
     $stmt->close();
     return ($count>0);
  } else {
     return false;
  }
}

更新:卑劣な「fund_max は 10 進数です」というコメントについて... Fund_max が 10 進数の場合は、double にバインドする必要があります。それ以外の場合は、bind_paramコマンド中に小数点以下の桁数が失われます (私のコードが更新されました)

于 2012-10-02T20:12:03.350 に答える
1

大げさな推測ですが、渡された値が$project_idデータベースに存在しないようです。

これにより、UPDATEコマンドが実行されますが、失敗することはありませんが、レコードは更新されません。

于 2012-10-02T20:08:19.797 に答える
1

別の推測、project_idおよび/またはfund_max両方の整数ではない可能性があります。マニュアルで確認できます

また、列の名前は、更新クエリで名前自体に含まれていない限り、引用符 (`) で囲まないでください。

編集:

function change_fund_max ($mysqli, $project_id, $fund_max) {

if ($stmt = $mysqli->prepare("UPDATE project_fund_max SET fund_max = ? WHERE 
 project_id = ?")){
 $stmt->bind_param('di', $fund_max, $project_id);
 $return = $stmt->execute();
 $stmt->close();
 return $return;
}  else {return false;}      

}
于 2012-10-02T20:12:58.060 に答える