更新语句不起作用(常规语句以及准备好的语句)
update statement is not working (regular statement as well as prepared statement)
我可以毫无问题地从 mysql 数据库中插入和 select,但无法更新记录。
最初我使用 mysqli_query 没有任何结果或错误。后来我试了prepared statement,没有结果。
在这里分享我的代码:
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
但是检查 table 没有更新。
从昨天开始尝试,我错过了什么?
更新:
此代码最初是在 windows 中开发的,但后来我决定在 Ubuntu 16.04 中继续工作。在 ubuntu 中似乎连插入都不起作用。可能是 ubuntu 安全相关问题?
尝试将 execute 语句放入一个变量中,并在最后回显它,以便您可以查看查询是否失败。
然后尝试将查询的输出放入 phpmyadmin 以查看是否有错误。
请试试这个。 $dc1
在 mysqli_stmt_bind_param
中使用时未定义。对于您 $dc1
持有更新记录的 id
。如果这是空的,这就是为什么您不会在数据库中看到任何更改的原因。查询运行但不影响任何行。
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");
}
我可以毫无问题地从 mysql 数据库中插入和 select,但无法更新记录。
最初我使用 mysqli_query 没有任何结果或错误。后来我试了prepared statement,没有结果。
在这里分享我的代码:
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
但是检查 table 没有更新。 从昨天开始尝试,我错过了什么?
更新: 此代码最初是在 windows 中开发的,但后来我决定在 Ubuntu 16.04 中继续工作。在 ubuntu 中似乎连插入都不起作用。可能是 ubuntu 安全相关问题?
尝试将 execute 语句放入一个变量中,并在最后回显它,以便您可以查看查询是否失败。
然后尝试将查询的输出放入 phpmyadmin 以查看是否有错误。
请试试这个。 $dc1
在 mysqli_stmt_bind_param
中使用时未定义。对于您 $dc1
持有更新记录的 id
。如果这是空的,这就是为什么您不会在数据库中看到任何更改的原因。查询运行但不影响任何行。
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");
}