2014-11-25 5 views
1
  1. Вставляю данные в таблицу под названием «реестр». Первый столбец (id_roster) - это идентификатор, использующий автоинкремент mysql.
  2. Я бегу ОТБОРНОЕ, чтобы найти id_roster
  3. Я использую эту id_roster, чтобы вставить его в таблицу «roster_par_membre» вместе с другими даннымиВозврат идентификатора (автоинкремент) вставленной строки

    if ($insert_stmt = $mysqli->prepare("INSERT INTO `roster`(`nom_roster`, `description_roster`, `id_organisation`, `created_by`, `creation_date`,`modified_by`) VALUES (?, ?, ?, ?, ?, ?)")) { 
    
        $insert_stmt->bind_param('ssiisi', $roster_name, $description_roster, $organisation_id, $user_id, $creation_date, $user_id); 
    
        if (!$insert_stmt->execute()) { 
          $reponse = 'Sorry, a database error occurred; please try later'; 
         } else { 
          // if INSERT OK -> create a new line in roster_membre table 
           //1. get the roster_id 
           $sql = "SELECT r.id_roster 
              FROM roster r 
              WHERE r.nom_roster = ? 
              LIMIT 1"; 
           $stmt = $mysqli->prepare($sql); 
    
            if ($stmt) { 
             $stmt->bind_param('s', $roster_name); 
             $stmt->execute(); // Execute the prepared query. 
             $stmt->store_result(); 
             $stmt->bind_result($id_roster); 
             $stmt->fetch(); 
    
             $level = 1; 
            //2. create a line with the roster_id and insert the membre as level 1 
             $insert_stmt = $mysqli->prepare("INSERT INTO `roster_par_membre`(`id_membre`, `id_roster`, `level`, `modified_by`) VALUES (?,?,?,?)"); 
             $insert_stmt->bind_param('iiii', $user_id, $id_roster, $level, $user_id); 
             $insert_stmt->execute(); 
    
            $reponse = 'success'; 
            } 
    

Пока код работает, но это не очень приятно. Есть ли способ, когда мы создаем новую строку в таблице, чтобы напрямую возвращать значение (id с автоматическим приращением), которое должно использоваться в запросе sql (чтобы вставить данные во вторую таблицу)? или, возможно, объединить два запроса (два INSERT) в одном статусе?

короткое редактирование: это ответ AJAX $ возвращаемое значению (JSON)

+2

Ищете LAST_INSERT_ID ? –

+2

как насчет использования mysqli-> query (insert), mysqli-> insert_id? – albanx

+0

@vp_arth да что именно это last_insert_id; Я проверю. Любая идея о том, как я могу изменить свой код соответственно? –

ответ

0

Ok, решение:

   //1. get the roster_id 
      $sql = "SELECT r.id_roster 
         FROM roster r 
         WHERE r.nom_roster = ? 
         LIMIT 1"; 
      $stmt = $mysqli->prepare($sql); 

       if ($stmt) { 
        $stmt->bind_param('s', $roster_name); 
        $stmt->execute(); // Execute the prepared query. 
        $stmt->store_result(); 
        $stmt->bind_result($id_roster); 
        $stmt->fetch(); 

Просто нужно заменить всю эту часть на

$id_roster = $mysqli->insert_id; 

Ниццы и легко. СПАСИБО albanx

+0

Это нормально. Я просто отправляю несколько примеров коротких рук, которые я использую для записи запросов быстрее. – albanx

0

эти функции я использовал для запроса на проекты, которые я не хочу использовать какие-либо рамки (только PHP):

/** 
    * 
    * Executes query methods 
    * @param string $query the query string 
    * @param array $vals array of values 
    * @param bool $show show the query 
    * @return int/array/false 
    */ 
    function q($query, $vals=array(), $show_query=false) 
    { 
     $conn = new mysqli(...) 
     $offset = 0; 
     foreach ($vals as $v) 
     { 
      $cv  = $conn->real_escape_string($v);//escape the value for avoiding sql injection 
      $fv  = ($v===NULL) ? 'NULL':"'".$cv."'"; //if value is null then insert NULL in db 
      $qpos = strpos($query, '?', $offset);//replace the ? with the valeue 
      $query = substr($query, 0, $qpos).$fv.substr($query, $qpos+1); 
      $offset = $qpos+strlen($cv)+1; 
     } 

     $result = $conn->query($query); 

     if($show || $result===false) echo $query."<br>"; 
     $rows = array(); 
     if($result===true) 
     { 
      return $conn->affected_rows; 
     } 
     else if($result===false) 
     { 
      return false; 
     } 
     else 
     { 
      while ($row = $result->fetch_array(MYSQLI_ASSOC)) 
      { 
       $rows[]=$row; 
      } 
     } 

     return $rows; 
    } 

    function lastid() 
    { 
     return $this->qval("SELECT LAST_INSERT_ID()"); 
    } 

Пример использования:

q('INSERT INTO USER(name, email) VALUES(?,?)', array('admin','[email protected]')); 
$id = lastid(); 
+0

Я сделал некоторое ручное экранирование здесь, но это может быть адаптировано для использования с mysqli-> prepare – albanx

+0

Итак, вы открываете соединение для каждого запроса и вводите исходное значение php в то, что выглядит готовым, а затем u злоупотребляете системой впрыскивание значений в '?' ... – DarkBee

+0

@DarkBee на самом деле это не полный класс, это просто пример, как я уже сказал, можно адаптировать. И в чем проблема ускользания и использования? и ввести исходное значение php? – albanx

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