2016-10-20 4 views
2

У меня есть две таблицы users И requests. Таблица пользователей имеет столбцы: id, username, password и town. Я могу вставить данные в users. requests таблица имеет: id, user_id, product_name, proposed_price и request_description, где user_id является внешним ключом к реферирование id из users таблицы. Проблема заключается в том, что данные вставки не выполняются в таблице requests, которая имеет user_id в качестве внешнего ключа. Я получаю сообщение об ошибке:Как вставить с помощью внешнего ключа в дочерней таблицы PHP

Undefined variable: user_id and mysqli_stmt::bind_param(): Number of variables doesn't match number of parameters in prepared statement on line : $qry->bind_param("i", $user_id);

Эта функция должна быть использована в вставки:

public function User_request ($product_name, $proposed_price, $request_description) { 

    $qry = $this->conn->prepare("SELECT id FROM users WHERE id = '$user_id' "); 
    $qry->bind_param("i", $id); 
    $result= $qry->execute(); 
    $user_id = $qry->num_rows(); 
    $qry->close(); 

    if($user_id > 0){ 

    $stmt = $this->conn->prepare("INSERT INTO requests (user_id, product_name, proposed_price, request_description) VALUES(?, ?, ?, ?)"); 

    $stmt->bind_param("sss",$user_id, $product_name, $proposed_price, $request_description); 
    $result = $stmt->execute(); 
    $stmt->close(); 

    // check for successful store 
    if ($result) { 
     $stmt = $this->conn->prepare("SELECT * FROM requests WHERE request_description = ?"); 
     $stmt->bind_param("s", $request_description); 
     $stmt->execute(); 
     $user = $stmt->get_result()->fetch_assoc(); 
     $stmt->close(); 

     return $user; 
    } else { 
     return false; 
    } 

    } 
} 

И ниже код вызывает выше функции:

<?php 

include './DbHandler.php'; 
$db = new DBHandler(); 

// json response array 
$response = array("error" => FALSE); 

if (isset($_POST['product_name']) && isset($_POST['proposed_price']) &&  isset($_POST['request_description'])) { 

// receiving the post params 
$product_name = $_POST['product_name']; 
$proposed_price =$_POST['proposed_price']; 
$request_description =$_POST['request_description']; 

    // create a new request 
    $user = $db-User_request($product_name, $proposed_price, $request_description); 
    if ($user) { 
     // user stored successfully 
     $response["error"] = FALSE; 
     $response["user"]["username"] = $user["username"]; 
     $response["user"]["proposed_price"] = $user["proposed_price"]; 
     $response["user"]["request_description"] = $user["request_description"]; 

     echo json_encode($response); 
    } else { 
     // user failed to store 
     $response["error"] = TRUE; 
     $response["error_msg"] = "oops error occured!"; 
     echo json_encode($response); 
    } 
} 
    else { 
    $response["error"] = TRUE; 
     $response["error_msg"] = "Required parameters are missing!"; 
    echo json_encode($response); 
    } 
    ?> 
+0

Ответ такой же: http://stackoverflow.com/questions/39619591/how-to-get-last-auto-increment-value-as-foreign-key-to-another-table-in -php/43539268 # 43539268 –

ответ

1

Rewrite User_request() функции соответственно:

public function User_request ($product_name, $proposed_price, $request_description) { 

    $qry = $this->conn->prepare("SELECT id FROM users WHERE id = ? "); 
    $qry->bind_param("i", $user_id); 
    $result= $qry->execute(); 
    $user_id = $qry->num_rows(); 
    $qry->close(); 

    if($user_id > 0){ 

     $stmt = $this->conn->prepare("INSERT INTO requests (user_id, product_name, proposed_price, request_description) VALUES(?, ?, ?, ?)"); 

     $stmt->bind_param("isss", $user_id, $product_name, $proposed_price, $request_description); 
     $result = $stmt->execute(); 
     $stmt->close(); 

     // check for successful store 
     if ($result) { 
      $stmt = $this->conn->prepare("SELECT * FROM requests WHERE request_description = ?"); 
      $stmt->bind_param("s", $request_description); 
      $stmt->execute(); 
      $user = $stmt->get_result()->fetch_assoc(); 
      $stmt->close(); 

      return $user; 
     } else { 
      return false; 
     } 
    } 
} 

Примечание:
Вы должны использовать заполнитель ? в подготовке заявления: $this->conn->prepare("SELECT id FROM users WHERE id = '$user_id' "); вместо '$user_id', так как у вас есть $qry->bind_param("i", $user_id).
Аналогичная ошибка в $stmt->bind_param("sss",$user_id, $product_name, $proposed_price, $request_description);, заменить "sss" на "isss".

+0

plz i не вижу разницы –

+0

i updated '$ this-> conn-> prepare (" SELECT id FROM users WHERE id = '$ user_id' ");' to '$ this-> conn-> prepare ("SELECT id FROM users WHERE id =?"); 'и заменить" sss "на" isss ", но ошибка сохраняется –

+0

@ новая ошибка: ошибка сбоя магазина' oops error occured' i, установленная в часть кода, которая вызывает ** функцию User_request ** –

0

Вы ищете строковый литерал '$ user_id' здесь.

$qry = $this->conn->prepare("SELECT id FROM users WHERE id = '$user_id' "); 

Возможно, это не то, что вы хотите. Вы также используете именованные заполнители, которые нигде не найдены в вашем запросе. Я предлагаю рассмотреть документы PDO.

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