php mysql как да използвам mysql_insert_id(), за да мога да вмъкна в 2 таблици едновременно?

Използвам php с mysql база данни, за да направя някакво вмъкване. Имам 2 маси.

  • потребител
  • състояние, където втората таблица има като външен ключ user_id за връзка между тези 2 таблици

проблемът ми е, че когато вмъкна в таблицата със състоянието, полето user_id се променя и приема 0, без значение какъв е user_id.

така че как да поправя този проблем???

това е кодът на login.php

<?php
//array for JSON response
$response = array();

// check for required fields
if(empty($_POST['user']) || empty($_POST['password'])){
       $response["success"] = 0;
       $response["message"] = "enter Both Fields";
        // echoing JSON response
        die (json_encode($response));


}

else if (isset($_POST['user']) && isset($_POST['password']) ) {

    $user = $_POST['user'];
    $password = $_POST['password'];


    // include db connect class
    require_once '/db_connect.php';

    // connecting to db
    $db = new DB_CONNECT();

    // mysql inserting a new row
    $sql = mysql_query("Select user, password from users where user='$user'")or die(mysql_error());
    $count_query = mysql_num_rows($sql);
    if($count_query >0){
     $response["success"] = 1;
        $response["message"] = "correct Informations";

   // echoing JSON response
        echo json_encode($response);
    }
     else{
        $response["success"] = 0;
        $response["message"] = "Wrong User Or Pass";

        // echoing JSON response
        echo json_encode($response);
    }
}
else {
    // required field is missing
    $response["success"] = 0;
    $response["message"] = "Required field(s) is missing";

    // echoing JSON response
    echo json_encode($response);
}   
?>

status.php

<?php

/*
 * Following code will create a new product row
 * All product details are read from HTTP Post Request
 */

// array for JSON response
$response = array();
if(empty($_POST['status'])){
       $response["success"] = 0;
       $response["message"] = "You must Write something";
        // echoing JSON response
        die (json_encode($response));
}

// check for required fields
else if (isset($_POST['status'])) {

    $status = $_POST['status'];

    // include db connect class
    require_once __DIR__ . '/db_connect.php';

    // connecting to db
    $db = new DB_CONNECT();



    // mysql inserting a new row
    $result = mysql_query("INSERT INTO status(status, user_id) VALUES('$status' , '$last_insert_id')") or die(mysql_error);
    $last_insert_id = mysql_insert_id();

    // check if row inserted or not
    if ($result) {
        // successfully inserted into database
        $response["success"] = 1;
        $response["message"] = "Your Status has been saved.";

        // echoing JSON response
        die (json_encode($response));
    } else {
        // failed to insert row
        $response["success"] = 0;
        $response["message"] = "Oops! An error occurred.";

        // echoing JSON response
        die (json_encode($response));
    }

}

?>

Използвам php с android, така че тяхната форма не е html


person user3499032    schedule 04.04.2014    source източник
comment
вашият '$last_insert_id' не е зададен на нищо преди извикването на mysql_query()?   -  person Reinder Wit    schedule 04.04.2014
comment
така че как да се реши това и да се добави стойността на полето user_id към базата данни???   -  person user3499032    schedule 04.04.2014
comment

Сигурен съм, че пропускам нещо незначително тук. Прилагам javascript foreach цикъл върху масив от обекти. В рамките на цикъла правя асинхронно повикване към api за актуализиране на данни. Това, което искам, е цикълът foreach да изчака обещанието да бъде изпълнено, преди да премине към следващата итерация.

Ето примерния код

entriesToUpdate.forEach(function (item) {   
    SomeService.updateEntry(item).then(function (res) {
        //Do some stuff here.
    });
    //Wait for the above promise to be fulfilled before going to next iteration 
});
  -  person Reinder Wit    schedule 04.04.2014
comment
как да поставите потребителския идентификатор в бисквитка и да го използвате в android??   -  person user3499032    schedule 04.04.2014
comment
Не съм запознат с работата на PHP в Android, но предполагам, че трябва да можете да създадете някакъв вид сесия, както каза @Marc B в отговора си. Това имах предвид с използването на бисквитка.   -  person Reinder Wit    schedule 04.04.2014


Отговори (1)


не можеш mysql_insert_id() се отнася само за ПОСЛЕДНОТО извършено вмъкване. Ако правите две вмъквания и извиквате insert_id() след второто, първият идентификатор се губи.

Няма начин да се заобиколи това.

Трябва да имате нещо като:

INSERT INTO foo ....
$fooid = mysql_insert_id();
INSERT INTO bar .... foo_id=$fooid
$barid = mysql_insert_id();

Като се има предвид, че вашият код всъщност изглежда разделен на няколко страници, това е още по-лошо. mysql_insert_id() се прилага само за ТЕКУЩАТА връзка към базата данни. След като първият ви скрипт излезе, връзката се затваря и insert_id се губи.

Следващият скрипт ще получи НОВА връзка и ще има собствена напълно отделна система за вмъкване на id.

За верижно свързване на няколко страници заедно по този начин, ще трябва да извлечете/предадете идентификатора на вмъкване около себе си, напр.

Страница 1:

INSERT ...
$_SESSION['page1_id'] = mysql_insert_id();

страница2:

$last_id = $_SESSION['page1_id'];
INSERT ..... id=$last_id
person Marc B    schedule 04.04.2014
comment
така че какво казвате, че трябва да създам $_SESSION в php файла на първата страница, отколкото да извлека тази сесия като външен ключ във втората таблица, която се използва във втората страница?? - person user3499032; 04.04.2014
comment
Първият идентификатор се губи само когато извършите 2 заявки. Ако направите групово вмъкване на `стойности (...), (...)', можете да изчислите следващия идентификатор, като добавите +1 към идентификатора, който ще бъде идентификаторът на първия запис на груповото вмъкване. - person Mateusz Nowak; 30.06.2014