2014-10-10 2 views
0

У меня есть разговор таблицы и разговор ответа стол:обновление SQL таблицы рекурсивно с PHP

разговор стол:

+-------+-------+--------+ 
| cid | u_1 | uid_2 | 
+-------+-------+--------+ 
| 1  | 8  | 3  | 
| 2  | 8  | 5  | 
| 3  | 8  | 2  | 
+-------+-------+--------+ 

conversation_reply стол:

+-------+-------+--------+--------+ 
| cr_id | reply | uid_fk | cid_fk | 
+-------+-------+--------+--------+ 
| 1  |  | 8  | 1  | 
| 2  |  | 8  | 11  | 
| 3  |  | 8  | 11  | 
+-------+-------+--------+--------+ 

Мне нужно, чтобы иметь возможность обновить таблица бесед с новой записью, если она не существует при создании нового ответа, однако я получаю следующую ошибку:

Cannot add or update a child row: a foreign key constraint fails 
(`_db`.`conversation_reply`, CONSTRAINT `conversation_reply_ibfk_2` 
FOREIGN KEY (`cid_fk`) REFERENCES `conversation` (`cid`)) 

Любая помощь очень ценится !!!!

EDIT

Я поставил запрос Convo ответ в создании нового Convo запроса, это создаст новый Convo, но до сих пор не вставляет ответ:

if (!empty($_GET['conv_id'])) { 

     $cid = mysql_real_escape_string($_GET['conv_id']); 
      echo $cid; 

    } 


if($user_one!=$user_two){ 

// Check convo doesn't already exist. 

$q_exist= mysql_query("SELECT c_id FROM mc_conversation WHERE (user_one='$user_one' and user_two='$user_two') or (user_one='$user_two' and user_two='$user_one') ") or die(mysql_error()); 

if(mysql_num_rows($q_exist)==0) { 
    $query = mysql_query("INSERT INTO mc_conversation (user_one,user_two,ip,time) VALUES ('$user_one','$user_two','$ip','$time')") or die(mysql_error()); 
    $q=mysql_query("SELECT c_id FROM mc_conversation WHERE user_one='$user_one' ORDER BY c_id DESC limit 1"); 
    $v=mysql_fetch_array($q); 
    return $v['c_id']; 
    $v_cid = $v['c_id']; 

    // Insert reply. 

    $qR= mysql_query("INSERT INTO mc_conversation_reply (user_id_fk,reply,ip,time,c_id_fk) VALUES ('$uid','$reply','$ip','$time','$v_cid')") or die(mysql_error()); 


// Convo already exists. 

} else { 


    $v=mysql_fetch_array($q_exist); 
    return $v['c_id']; 

    // Insert reply 

    $qR= mysql_query("INSERT INTO mc_conversation_reply (user_id_fk,reply,ip,time,c_id_fk) VALUES ('$uid','$reply','$ip','$time','$cid')") or die(mysql_error()); 

    echo $cid; 

} 

}

+3

необходимо сначала создать родительские записи. например вставьте в 'беседу' FIRST, затем вставьте в таблицу ответов. –

+0

Спасибо, по какой-то причине, когда я делаю это так, диалог создается, но ответ не создается ... – user43251

+0

Я добавил еще код .. – user43251

ответ

0

Вы вызвали «возврат» в своем цикле else, который завершит выполнение функции или вызовет из глобальной области выполнения текущий скрипт. http://php.net/manual/en/function.return.php Попробуйте это:

// Insert reply 
$v=mysql_fetch_array($q_exist); 
$qR= mysql_query("INSERT INTO mc_conversation_reply (user_id_fk,reply,ip,time,c_id_fk) VALUES ('$uid','$reply','$ip','$time','$cid')") or die(mysql_error()); 
echo $cid; 
+0

Спасибо! Какая глупая ошибка! Избавилось от одного возвращения и сдвинуло другое, похоже, сейчас работает! Благодаря! – user43251

+0

Не беспокойтесь. Легко сделано. Просто помните, что всегда возвращайте результат в конце вашей функции (или в тот момент, когда вы счастливы, что он прекратит выполнение, например, в конце инструкции if/else). – gazareth

0

Из кода, который вы писали, я думаю, что проблема с возврата заявление.

Ответ не будет вставлен, потому что у вас есть

return $v['c_id']; 

перед кодом INSERT запроса. И если этот код находится внутри функции, он просто вернет значение и не выполнит дальнейшую строку.

У вас должен быть оператор возврата в самом конце функции/после выполнения всех необходимых операций. Если это предназначено для отладки, вы можете использовать инструкцию echo.

+0

Спасибо за помощь, это был случай, но gazareth открыл его первым! Спасибо, хотя, вы тоже правы! – user43251

+0

Эй, хорошо, когда я печатал ответ, никто не указал на эту ошибку. Я думаю, газза также печатал одновременно со мной :) Когда я попал в ящик, я походил на ответ WOW, который уже опубликован. Рад, что вы получили то, что вам нужно. – Dharam

Смежные вопросы