我想将两个不同的记录插入两个不同的表中并删除原始记录。像这样
$msgid = POST_['roll_id'];
$query = "INSERT INTO del_subscription SELECT * from subscription WHERE mem_id='$msgid'";
$query1 = "INSERT INTO del_user_data SELECT * from user_data WHERE mem1_id='$msgid'";
$query2 ="DELETE FROM subscription WHERE mem_id='$msgid'";
$query3 ="DELETE FROM user_data WHERE mem_id='$msgid'";
可以对此查询使用multi_query。
我使用了多个查询,但只使用了第一个查询
$msgid = POST_['roll_id'];
if (strlen($msgid) > 0)
{
$query = "INSERT INTO del_subscription SELECT * FROM subscription WHERE name='$msgid' AND renewal='yes';" ;
$query .= "INSERT INTO del_user_data SELECT * FROM user_data WHERE name='$msgid'AND wait='no';";
$query .= "DELETE FROM subscription WHERE name='$msgid' AND renewal='yes';" ;
$query .= "DELETE FROM user_data WHERE name='$msgid' AND wait='no'";
if (mysqli_multi_query($con, $query))
{
do {
/* store first result set */
if ($result = mysqli_store_result($con)) {
while ($row = mysqli_fetch_row($result)) {
echo "null";
}
if($result) { mysqli_free_result($result); }
}
/* print divider */
if (mysqli_more_results($con)) {
echo "<html><head><script>alert('Member Deleted');</script></head></html>";
echo "<meta http-equiv='refresh' content='0; url=view_mem.php'>";
}
} while (mysqli_next_result($con));
}
}
else {
echo "<html><head><script>alert('ERROR! Delete Operation Unsuccessful');</script></head></html>";
echo "<meta http-equiv='refresh' content='0; url=view_mem.php'>";
}
/* close connection */
mysqli_close($con);
这里我们要运行Member Deleted
一次而不是四次,直到完成查询。
答案 0 :(得分:0)
我完全重写了这个答案。
由于很难将我所写的内容拼接到您所写的内容中,因此我会完全使用此代码或根本不使用此代码。
free_result
和fetch_row
命令不应该存在。它们会导致错误,因为INSERT
和DELETE
查询没有结果集。
$msgid = $_POST['roll_id'];
if(strlen($msgid) > 0):
$queries = array();
$queries[] = "INSERT INTO del_subscription SELECT * FROM subscription WHERE `name`='".$msgid."' AND `renewal`='yes';";
$queries[] = "INSERT INTO del_user_data SELECT * FROM user_data WHERE `name`='".$msgid."' AND `wait`='no';";
$queries[] = "DELETE FROM subscription WHERE `name`='".$msgid."' AND `renewal`='yes';";
$queries[] = "DELETE FROM user_data WHERE `name`='".$msgid."' AND `wait`='no';";
// Set flag TRUE unless we find otherwise
$ALL_SUCCESSFUL = TRUE;
// Executes query and enters if the first query was successful.
if ( mysqli_multi_query($con, implode(' ',$queries)) ):
// This do-while tests if all other queries were successful
do
if( $result = mysqli_store_result($con) ):
if(!$result):
$ALL_SUCCESSFUL = FALSE ;
endif;
endif;
// Changes internal pointer to next result.
while( mysqli_next_result($con) );
endif; // If first query was successful
if( $ALL_SUCCESSFUL ):
echo showMessage('Member Deleted!');
else:
echo showMessage('ERROR! Delete Operation Unsuccessful');
endif;
else:
echo showMessage('ERROR! No roll_id given');
endif; // If roll_id is valid
/* close connection */
mysqli_close($con);
function showMessage($msg){
$html = '';
$html.= "<html><head>";
$html.= "<meta http-equiv='refresh' content='0' url='view_mem.php' />";
$html.= "<script>alert('".$msg."');</script>";
$html.= "</head></html>";
return $html;
}
如果你发现第一个查询执行但没有像你之前所说的那样执行,那不是因为php代码。这是因为你写的查询。在mysqli_multi_query()
中,所有查询都在同一个调用中执行,因此如果执行了一个查询,它们都被执行了......即使并非所有查询都成功。
基本上这意味着multi_query
之后的任何PHP代码都不会影响其他SQL查询的结果。我们基本上可以扔掉所有东西,然后写下来让它工作:
$msgid = $_POST['roll_id'];
$queries = array();
$queries[] = "INSERT INTO del_subscription SELECT * FROM subscription WHERE `name`='".$msgid."' AND `renewal`='yes';";
$queries[] = "INSERT INTO del_user_data SELECT * FROM user_data WHERE `name`='".$msgid."' AND `wait`='no';";
$queries[] = "DELETE FROM subscription WHERE `name`='".$msgid."' AND `renewal`='yes';";
$queries[] = "DELETE FROM user_data WHERE `name`='".$msgid."' AND `wait`='no';";
mysqli_multi_query($con, implode(' ',$queries));
mysqli_close($con);
此外,对于表格到表格直接INSERT
查询,如果没有像您所写的那样使用SELECT *
时定义的列,请仔细检查数据库以确保两个表具有相同的列结构并且列字段匹配。但是,这不太可能打破查询。
答案 1 :(得分:0)
我提供逐项解决方案的瑕疵太多了,所以我会提供重写,假设您的查询有效(我相信他们需要一些工作):
if(isset($_POST['submit'])){
$msgid=$_POST['roll_id'];
if(strlen($msgid)>0){
$esc_msqid=mysqli_real_escape_string($con,$msgid);
$queries[] = "INSERT INTO del_subscription SELECT * FROM subscription WHERE `mem_id`='$esc_msqid' AND `renewal`='yes'";
$queries[] = "INSERT INTO del_user_data SELECT * FROM user_data WHERE `newid`='$esc_msqid' AND `wait`='no'";
$queries[] = "DELETE FROM subscription WHERE `mem_id`='$esc_msqid' AND `renewal`='yes'";
$queries[] = "DELETE FROM user_data WHERE `newid`='$esc_msqid' AND `wait`='no'";
// Executes query and enters if the first query was successful.
if(mysqli_multi_query($con,implode(';',$queries))){
do{
list($current_key,$current_query)=each($queries); //advances array pointer to first or next element
if(mysqli_affected_rows($con)<1){
$alert="Query Logic Error @ Query#$current_key with id=$msgid";
}
} while(mysqli_more_results($con) && mysqli_next_result($con));
}else{
list($current_key,$current_query)=each($queries); //advances array pointer to first element
}
if($error_mess=mysqli_error($con)){
$alert="Syntax Error @ Query#$current_key with id=$msgid"; // str_replace("'","\'",$error_mess);
}
if(!$alert){
echo "<html><head><script>alert('Member Deleted');</script></head></html>";
echo "<meta http-equiv='refresh' content='0; url=view_mem_del.php'>";
}else{
echo "<html><head><script>alert('ERROR! Delete Operation Unsuccessful\n$alert');</script></head></html>";
echo "<meta http-equiv='refresh' content='0; url=view_mem.php'>";
}
}else{
showMessage('ERROR! No msgid given');
}
}else{
echo showMessage('ERROR! No roll_id given');
}
mysqli_close($con);
答案 2 :(得分:-1)
if(isset($_POST['submit']))
{
$msgid = $_POST['roll_id'];
if(strlen($msgid) > 0):
$queries = array();
$queries[] = "INSERT INTO del_subscription SELECT * FROM subscription WHERE `mem_id`='".$msgid."' AND `renewal`='yes';";
$queries[] = "INSERT INTO del_user_data SELECT * FROM user_data WHERE `newid`='".$msgid."' AND `wait`='no';";
$queries[] = "DELETE FROM subscription WHERE `mem_id`='".$msgid."' AND `renewal`='yes';";
$queries[] = "DELETE FROM user_data WHERE `newid`='".$msgid."' AND `wait`='no';";
// Set flag TRUE unless we find otherwise
$ALL_SUCCESSFUL = TRUE;
// Executes query and enters if the first query was successful.
if ( mysqli_multi_query($con, implode(' ',$queries)) ):
// This do-while tests if all other queries were successful
do
if( $result = mysqli_store_result($con) ):
if(!$result):
$ALL_SUCCESSFUL = FALSE ;
endif;
endif;
// Changes internal pointer to next result.
while( mysqli_next_result($con) );
endif; // If first query was successful
if( $ALL_SUCCESSFUL ):
echo "<html><head><script>alert('Member Deleted');</script></head></html>";
echo "<meta http-equiv='refresh' content='0; url=view_mem_del.php'>";
else:
echo "<html><head><script>alert('ERROR! Delete Operation Unsuccessful');</script></head></html>";
echo "<meta http-equiv='refresh' content='0; url=view_mem.php'>";
endif;
else:
echo showMessage('ERROR! No roll_id given');
endif; // If roll_id is valid
/* close connection */
mysqli_close($con);
}
这给出了我们预期的确切结果