2016-10-27 31 views
1

サブクエリのWHERE条件に基づいて新しいテーブルに挿入しようとするときに問題が発生します。サブクエリを使用してMySQLに複数の行を挿入する

は、私は1つのテーブルと呼ばれているproductoptions 4列LineID、ProductSize、ProductColourを持っている、ProductIDの

私は価格、第二のテーブルはproductprice 2列LineIDがあり呼ばれてい

私のアプリケーションはPHP postメソッドを使用して、単純なフォームからユーザー入力 'productID'を受け入れます。必要なのは、フォームにユーザーが指定したproductIDに基づいてproductpliceテーブルに新しい行を挿入して、productoptionsテーブルに存在するすべてのLineIDに対して新しい行を挿入することです。

私のPHPコードは以下の通りです:

if (isset($_POST['btn-add-price'])) { 
     $productID = mysqli_real_escape_string($con, $_POST['productID']); 
     $price = mysqli_real_escape_string($con, $_POST['price']); 


     if(empty($productID)) { 
      $error = true; 
      $num_error_two = "Please enter a value"; 
     } 
     if(!is_numeric($productID)) { 
      $error = true; 
      $value_error_two = "Data entered was not numeric"; 
     } 

     if(empty($price)) { 
      $error = true; 
      $num_error_three = "Please enter a value"; 
     } 
     if(!is_numeric($price)) { 
      $error = true; 
      $value_error_three = "Data entered was not numeric"; 
     } 
     if (!$error) { 
      if(mysqli_query($con, "INSERT INTO productprice (LineID,Price) VALUES(SELECT(LineID FROM productoptions WHERE LineID = '" . $productID . "'), '" . $price . "')")) { 
       $successmsg = "Successfully Added!"; 
      } else { 
       $errormsg = "Product already exists!"; 
      } 
     } 
    } 

フォームコード:

<form method="post" action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']);?>" class="col span-1-of-2 product-submit-form-form"> 

        <div class="row"> 
         <div class="col span-1-of-3"> 
          <label for="name">Product ID</label> 
         </div> 
         <div class="col span-2-of-3"> 
          <input type="text" name="productID" id="productID" placeholder="Product ID" required><br> 
          <span class="text-danger"><?php if (isset($value_error_two)) echo $value_error_two; ?></span> 
          <span class="text-danger"><?php if (isset($num_error_two)) echo $num_error_two; ?></span> 
         </div> 
        </div> 

        <div class="row"> 
         <div class="col span-1-of-3"> 
          <label for="name">Price</label> 
         </div> 
         <div class="col span-2-of-3"> 
          <input type="text" name="price" id="price" placeholder="Price" required><br> 
          <span class="text-danger"><?php if (isset($value_error_three)) echo $value_error_three; ?></span> 
          <span class="text-danger"><?php if (isset($num_error_three)) echo $num_error_three; ?></span> 
         </div> 
        </div> 

        <div class="row"> 
         <div class="col span-1-of-3"> 
          <label>&nbsp;</label> 
         </div> 
         <div class="col span-2-of-3"> 
          <input type="submit" value="Add" name="btn-add-price"> 
         </div> 
        </div> 

       </form> 

現在、これは、$ ERRORMSG

が、私もこの正しい方法に近づいてるスロー?私はちょうどPHPになって穏やかであり、私はいくつかの分野で私の理解が不足していると感じることができます!

提案を改正コード:

if (isset($_POST['btn-add-price'])) { 
     $productIDTwo = mysqli_real_escape_string($con, $_POST['productIDTwo']); 
     $price = mysqli_real_escape_string($con, $_POST['price']); 

     //name can contain only alpha characters and space 

     if(empty($productIDTwo)) { 
      $error = true; 
      $num_error_two = "Please enter a value"; 
     } 
     if(!is_numeric($productIDTwo)) { 
      $error = true; 
      $value_error_two = "Data entered was not numeric"; 
     } 

     if(empty($price)) { 
      $error = true; 
      $num_error_three = "Please enter a value"; 
     } 
     if(!is_numeric($price)) { 
      $error = true; 
      $value_error_three = "Data entered was not numeric"; 
     } 
     if (!$error) { 
      if(mysqli_query($con, "INSERT INTO productprice (LineID,Price) SELECT(LineID, " . $price . " FROM productoptions WHERE LineID = '" . $productIDTwo . "')")) { 
       $successmsg = "Successfully Added!"; 
      } else { 
       $errormsg = "Product already exists!"; 
      } 
     } 
    } 

これはまだ$のERRORMSGをスローします - 私は、SQLクエリ上記の$ successmsgを追加し、持つ問題であるように見えるんので、ブラウザに表示されませんSQLコードではなくフォーム入力エラーですか?

正しいコード:

if (isset($_POST['btn-add-price'])) { 
     $productIDTwo = mysqli_real_escape_string($con, $_POST['productIDTwo']); 
     $price = mysqli_real_escape_string($con, $_POST['price']); 

     //name can contain only alpha characters and space 

     if(empty($productIDTwo)) { 
      $error = true; 
      $num_error_two = "Please enter a value"; 
     } 
     if(!is_numeric($productIDTwo)) { 
      $error = true; 
      $value_error_two = "Data entered was not numeric"; 
     } 

     if(empty($price)) { 
      $error = true; 
      $num_error_three = "Please enter a value"; 
     } 
     if(!is_numeric($price)) { 
      $error = true; 
      $value_error_three = "Data entered was not numeric"; 
     } 
     if (!$error) { 
      if(mysqli_query($con, "INSERT INTO productprice (LineID,Price) SELECT LineID, " . $price . " FROM productoptions WHERE ProductID = '" . $productIDTwo . "'")) { 
       $successmsg = "Successfully Added!"; 
      } else { 
       $errormsg = "Product already exists!"; 
      } 
     } 
    } 
+0

間違った場所でSELECTとLineIDの間に開いたかっこがあると思いますか?'' $ price。 '') "' –

+0

私はあなたとは思えません。( "LineID、Price")サブクエリが必要です。 'select into select'を使います。古い例、http://stackoverflow.com/questions/30290438/insert-data-to-table-at-once-which-retrieve-from-mysql-select-command/30290474#30290474また、 'Product already exists! 'の前に、エラーが重複していて何か他ではないことを確認する必要があります。 – chris85

答えて

3

あなたが働いてSQLクエリを必要とするすべてのinsert select(分離されたコードで選択していないで、すべての列)

if(mysqli_query($con, 
    "INSERT INTO productprice (LineID,Price) 
     SELECT LineID, " . $price . 
     " FROM productoptions WHERE LineID = '" . $productIDTwo . "'")) { 
+0

助けてくれてありがとう...私は今これを理解していると思うが、これはまだ動作していないようだ。私はIDタグをフォーム上で修正しました。私はそのIDタグを2回使用していたため、問題を引き起こしていると考えました。私は$ successmsgをSQLクエリの上に掲載して、それが現れているかどうかを確認します。そうすれば、SQLの問題であるように見えます。これは$ errormsgをスローする修正されたコードです - – basil3

+0

@ basil3私は答えを更新しました......間違っています(選択(削除).. – scaisEdge

+0

素晴らしい...私はWHERE句で間違った列を実際に照会していたので小さなものを変更しなければなりませんでしたが、私はコードの完全な部分で私の質問を追加しました! – basil3

0

最初に実行する必要があります。

INSERT INTO productprice (LineID,Price) 
    SELECT LineID , YourPriceHere FROM productoptions 
    WHERE ProductID = YourProductHere; 

裸のSQLは、PHPに書き込む前に必ず動作するようにしてください。これを行うには、コマンドラインmysqlクライアントまたはその他のものを使用できます。また

、concatinationsはあなたのクエリが本当に醜いとハード読みに見えるので、あなたのデータベースと対話するためにPDOを使用していない場合、あなたは、少なくともこのようなSQLクエリを準備することができます:

最後に
$sql = 
    strtr(
    'SELECT * FROM productoptions WHERE ProductId = {ProductId}', 
    ['ProductId' => $productId] 
    ); 

テーブルやフィールドの名前を "product_options"、 "product_price"、 "product_id"のように再考してphp-codeでcamelCaseを使用すると良いでしょう。幸運:)

+0

ヒントをありがとう...私はすでにデータベーステーブルの名前を変更し始めているフィールド名。私は私のPHPを通して読んで、キャメルケースに始まる! – basil3

関連する問題