[求救] ajax傳值去php 再使用 foreach insert進SQL 問題

想請教我在ajax傳值進php

在使用foreach insert進sql 卻進不了sql

我有測試過不使用foreach 直接在php下 sql 是可行的 代表ajax有成功傳值過去php裡

但我在使用foreach時 就會失敗

所以我在想是不是我在ajax與foreach上哪邊少做了什麼動作了?

請求幫忙 以下是code


script部份

var summaryData = $(\"#addcontent\").jqxGrid('getcolumnaggregateddata', 'total', ['sum']);
var totalamount = \"&total_deductions=\" + summaryData.sum;
var rows = $('#addcontent').jqxGrid('getrows');
var result = \"\";
for(var i = 0; i < rows.length; i++)
{
var row = rows[i];
result += \"&name=\" + row.id + \"&quantity=\" + row.quantity + \"&purchase_price=\" + row.price + \"&total=\" + row.total + \"\n\";
}
$.ajax({
url:\"edit.php\",
data: 'id='+select.id + '&total_balance='+select.total_amount + totalamount + result,
type: \"POST\",

success: function(msg){
alert(\"成功\");
},
error:function(xhr, ajaxOptions, thrownError){
alert(\"錯誤\");
}
});



php部份

<?php
require_once(\"dbtools.inc.php\");


//入商品
$product_id = $_POST['name'];
$quantity = $_POST['quantity'];
$purchase_price = $_POST['purchase_price'];
$total= $_POST['total'];


//建立資料連接
$link = create_connection();

//釋放 $result 佔用的記憶體
mysql_free_result($result);

//執行 SQL 命令,新增此帳號


foreach($product_id as $v){
$sql = \"INSERT INTO pre_item ( product_id ) VALUES ( '$v' )\";
$result = execute_sql(\"pos\", $sql, $link);
}



//關閉資料連接
mysql_close($link);

?>

評論

  • success: function->
    console.log(msg);

    error:function->
    console.log(xhr.status);
    console.log(thrownError);
    可以看錯誤
  • i7807大
    不好意思 這麼晚我才回你
    我使用了你的方法
    他出現的錯誤是 Invalid argument supplied for foreach()
    似乎是我foreach 裡面接到參數不對?
  • 早安
    $product_id = $_POST['name'];
    $product_id 你要不要 echo 出來看看 值有沒有帶到
    而且 就算有 $product_id 這個也不是個 array 不能用 foreach阿~
  • clouding大
    我有 print_r($product_id);出來
    值只會帶到最後一個而已 所以永遠只帶一個
    想請問我該怎麼讓他變成array
  • 請問我這是看到的post出去的參數 是有其它部份
    但print_r($product_id);出來只有最後一個 就是18
    似乎沒辦法變array過去

    參數application/x-www-form-urlencoded不排序
    id 68
    name 25
    name 24
    name 18
    purchase_price 15
    purchase_price 199
    purchase_price 10
    quantity 1
    quantity 1
    quantity 1
    total 15
    total 199
    total 10
    total_balance null
    total_deductions 224
    原始碼
    id=68&total_balance=null&total_deductions=224&name=25&quantity=1&purchase_price=15&total=15&name=24&quantity=1&purchase_price=199&total=199&name=18&quantity=1&purchase_price=10&total=10
  • edited 一月 2015
    早安
    因為post出去的參數 不能是一樣
    所以它只會取最後那邊的值
    要馬就&name1="xxx" &name2="xxx"
    或者先post字串出去
    再把字串轉為array
    類似

      var summaryData = $(\"#addcontent\").jqxGrid('getcolumnaggregateddata', 'total', ['sum']);
    var totalamount = \"&total_deductions=\" + summaryData.sum;
    var rows = $('#addcontent').jqxGrid('getrows');
    var name = \"\";

    for(var i = 0; i < rows.length; i++){
    var row = rows[i];
    name += row.id + \",\";
    }
    $.ajax({
    url:\"edit.php\",
    data: 'id='+select.id + '&total_balance='+select.total_amount + totalamount + '&name=' + name,
    type: \"POST\",
    success: function(msg){
    alert(\"成功\");
    },
    error:function(xhr, ajaxOptions, thrownError){
    alert(\"錯誤\");
    }
    });


    <?php
    require_once(\"dbtools.inc.php\");
    //入商品
    $name = $_POST['name']; //x1,x2,x3,
    $name = substr($name,0,-1); // x1,x2,x3
    $product_id = explode(',',$name); //turn array $product_id [0]=x1 $product_id [1]=x2

    //建立資料連接
    $link = create_connection();
    //釋放 $result 佔用的記憶體
    mysql_free_result($result);
    //執行 SQL 命令,新增此帳號
    foreach($product_id as $v){
    $sql = \"INSERT INTO pre_item ( product_id ) VALUES ( '$v' )\";
    $result = execute_sql(\"pos\", $sql, $link);
    }
    //關閉資料連接
    mysql_close($link);
    ?>


    其它3個以此類推


  • clouding大
    謝謝你!!
    但是想請問 我還有問題想請教
    其它三個以此類推之後
    foreach 我要怎麼 去複數增加他?
    我剛使用這方法不對

    $quantity = $_POST['quantity'];
    $quantity = substr($quantity,0,-1);
    $quantity = explode(',',$quantity);

    foreach($product_id as $v){
    $sql = \"INSERT INTO pre_item ( product_id , quantity ) VALUES ( '$v' , '$quantity' )\";
    $result = execute_sql(\"pos\", $sql, $link);
    }
  • to Inverse :問題不在 php 而是在 html。
    想辦法讓前端 html 或 javascript 製造陣列資料傳送到後端伺服器給 php 。

    純 html 的作法類似

    <input type=\"text\" name=\"product[]\" id=\"product_1\" value=\"\">
    <input type=\"text\" name=\"product[]\" id=\"product_2\" value=\"\">


    那個 name 不是打錯,就是要名稱一模一樣,重點在後面的 [] ,送出後 php 收到的
    $_POST['product'] 就是個 array ,只要不為空就能用 foreach 循環讀值。

    用 javascript 也差不多這樣,想辦法寫出 product[1]=xxx&product[2]=yyyy 送到 php 也能成為 array。

    或是 javascript 使用 json post 到 php ,json_decode 也能成為陣列(參數設 true)或使用物件也行。
  • niotw大 謝謝
    我大概能理解問題出在javascript

    然後我有參考clouding大 提供的方式去處理 成功可以執行
    但是又遇到個問題想請教說



    $name = $_POST['name'];
    $name = substr($name,0,-1);
    $product_id = explode(',',$name);

    $quantity = $_POST['quantity'];
    $quantity = substr($quantity,0,-1);
    $quantity = explode(',',$quantity);
    //建立資料連接
    $link = create_connection();
    //釋放 $result 佔用的記憶體
    mysql_free_result($result);
    //執行 SQL 命令,新增此帳號
    foreach($product_id as $v){
    $sql = \\"INSERT INTO pre_item ( product_id , quantity ) VALUES ( '$v' , '$quantity' )\\";
    $result = execute_sql(\\"pos\\", $sql, $link);
    }


    當要使用多個陣列下去foreach時,但我只要全執行在一行$sql裡的話 我該怎麼處理會比較好
    像我上面的就似乎是個不行的答案

    foreach($product_id as $v){
    $sql = \\"INSERT INTO pre_item ( product_id , quantity ) VALUES ( '$v' , '$quantity' )\\";
    $result = execute_sql(\\"pos\\", $sql, $link);
    }


  • 早安
    感謝 niotw 大
    他的方法比較好
    我的處理方式 感覺會亂很多
    大概是這樣
    應該也可以變成二維陣列去處理
    code會乾淨很多
        var summaryData = $(\"#addcontent\").jqxGrid('getcolumnaggregateddata', 'total', ['sum']);
    var totalamount = \"&total_deductions=\" + summaryData.sum;
    var rows = $('#addcontent').jqxGrid('getrows');
    var result = \"\";
    for(var i = 0; i < rows.length; i++)
    {
    var row = rows[i];
    result += \"&data[\"+i+\"][name]=\" + row.id + \"&data[\"+i+\"][quantity]=\" + row.quantity + \"&data[\"+i+\"][purchase_price]=\" + row.price + \"&data[\"+i+\"][total]=\" + row.total + \"\n\";
    }
    $.ajax({
    url:\"edit.php\",
    data: 'id='+select.id + '&total_balance='+select.total_amount + totalamount + result,
    type: \"POST\",

    success: function(msg){
    alert(\"成功\");
    },
    error:function(xhr, ajaxOptions, thrownError){
    alert(\"錯誤\");
    }
    });

    <?php
    require_once(\"dbtools.inc.php\");


    //入商品
    $data = $_POST[\"data\"];

    //建立資料連接
    $link = create_connection();

    //釋放 $result 佔用的記憶體
    mysql_free_result($result);

    //執行 SQL 命令,新增此帳號


    foreach($data as $v){
    $sql = \"INSERT INTO pre_item ( product_id , quantity ) VALUES ( '$v[name]' , '$v[quantity]' )\";
    $result = execute_sql(\"pos\", $sql, $link);
    }



    //關閉資料連接
    mysql_close($link);

    ?>

  • clouding大 ! 謝謝你!
    我會試著去了解這些邏輯,真的對我幫助很大
    很感謝你們!!
Sign In or Register to comment.