Как использовать multi_query для вставки и удаления записей двух таблиц

Я хочу вставить две разные записи в две разные таблицы и удалить исходную. как это

$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

Решение

Я полностью переписал этот ответ.

Поскольку трудно разделить то, что я написал, на то, что вы написали, я бы использовал этот код целиком или не использовал его вообще.

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 * как вы написали, дважды проверьте вашу базу данных, чтобы убедиться, что две таблицы имеют одинаковую структуру столбцов и что поля столбцов совпадают. Однако это вряд ли нарушит запросы.

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);
0

Вот рабочий код с массивом

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);

}

Которые дают точный результат, что мы ожидали

-1
По вопросам рекламы [email protected]