Я хочу вставить две разные записи в две разные таблицы и удалить исходную. как это
$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
один раз вместо четырех раз до завершения запроса.
Я полностью переписал этот ответ.
Поскольку трудно разделить то, что я написал, на то, что вы написали, я бы использовал этот код целиком или не использовал его вообще.
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 successfulif( $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()
все запросы выполняются в одном и том же вызове, поэтому, если выполняется один, все они были выполнены … даже если не все привели к успеху.
В основном это означает, что любой код PHP после multi_query
не влияет на результаты ваших других запросов 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 *
как вы написали, дважды проверьте вашу базу данных, чтобы убедиться, что две таблицы имеют одинаковую структуру столбцов и что поля столбцов совпадают. Однако это вряд ли нарушит запросы.
У меня слишком много недостатков, чтобы предоставить подробное решение, поэтому я предложу переписать, предполагая, что ваши запросы работают (и я уверен, что им нужно немного поработать):
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);
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);
}
Которые дают точный результат, что мы ожидали