簡體   English   中英

如何從tabel中選擇行,而不是在php mysql中輸入到新表循環以進行計數選擇

[英]How to select row from tabel and than input to new table looping for count select before in php mysql

如何從表中選擇行而不是在php mysql中輸入到新表循環以進行計數選擇,

如果是喘息圖表。

在localhost中,此代碼可以查找。 但是,當我嘗試在線時為什么只有WHERE子句中的第一個記錄可以插入到Orders表並像dlete一樣。

     $sid = session_id();
    $sql = mysql_query("SELECT * FROM cart WHERE id_session='$sid'");

// get  orders number
$id_orders=mysql_insert_id();

while ($r=mysql_fetch_array($sql)) {
    $item = $r['item'];
    $size = $r['size'];
    $kateg_bahan = $r['kateg_bahan'];
    $warna = $r['warna'];
    $jumlah = $r['jumlah'];
    $harga = $r['harga'];
    $sub_total = $r['sub_total'];
    $id_keranjang =$r['id_keranjang'];

mysql_query("INSERT INTO orders(id_orders, id_kustomer, nama_kustomer, alamat, telpon, email, tgl_order, jam_order, jasa, id_kota, item, size, kateg_bahan, warna, jumlah, harga, sub_total) 
             VALUES('$id_orders', '$id_kustomer', '$nama','$alamat','$telpon','$email','$tgl_skrg','$jam_skrg', '$jasa', '$id_kota','$item', '$size', '$kateg_bahan', '$warna', '$jumlah', '$harga', '$sub_total')");


    }
$delsql = mysql_query("SELECT * FROM keranjang WHERE id_session='$sid'");   
while ($r=mysql_fetch_array($delsql)) {
 mysql_query("DELETE FROM keranjang WHERE id_keranjang = '$r[id_keranjang]'");
}

很難理解你想要實現的目標,但顯而易見的是你不必要地通過查詢來訪問你的數據庫。

恕我直言所有你的代碼可以歸結為兩個可能看起來像這樣的SQL查詢

$sid = session_id();
// get  orders number
$id_orders = mysql_insert_id();

$sql = "
INSERT INTO orders
       (id_orders, id_kustomer, nama_kustomer, 
        alamat, telpon, email, tgl_order, 
        jam_order, jasa, id_kota, 
        item, size, kateg_bahan, warna, jumlah, harga, sub_total) 
SELECT '$id_orders', '$id_kustomer', '$nama',
       '$alamat','$telpon','$email','$tgl_skrg',
       '$jam_skrg', '$jasa', '$id_kota', 
       item, size, kateg_bahan, warna, jumlah, harga, sub_total
  FROM cart 
 WHERE id_session = '$sid'";
$result = mysql_query($sql);
if (!$result) {
    die(mysql_errno() . ": " . mysql_error()); //TODO better error handling
}

$sql = "DELETE FROM keranjang WHERE id_session = '$sid'";
$result = mysql_query($sql);
if (!$result) {
    die(mysql_errno() . ": " . mysql_error()); //TODO better error handling
}

請注意:您使用的是不推薦使用的擴展名mysql_*並且您的代碼容易受到sql注入攻擊。 使用PDOMySQLi學習和使用 准備語句

現有代碼幾乎無法解讀。 它試圖完成的“大創意”似乎被許多不必要的操作所掩蓋,以及整個大量不必要的SQL執行。

我們推斷,因為mysql_insert_id()函數返回插入的最后一行的AUTO_INCREMENT值。 並且在循環之前調用一次,並且檢索的值作為列值插入到以下插入中...我們推斷id_orders是其他表的外鍵,其中只插入了一行。

(列名id_ordersorders表中列的奇怪選擇,對於不是行的唯一標識符的列。如果這是唯一標識符,那么我們期望很多insert語句失敗帶有重復的密鑰異常。

並且鑒於沒有檢查INSERT語句的執行是否成功,我們是否認為INSERT的失敗是正常的,我們可以繼續處理? (這有點奇怪,除非計划真的是把我們的小指放到我們嘴角,邪惡博士的風格,並說“我只是假設一切都要計划。什么?”)

我只是無法理解這個需要在循環中完成的原因,通過痛苦行處理每一行,每行,當使用兩個相對簡單的SQL語句可以更有效地完成相同的最終結果時。

看起來問題中的痛苦代碼試圖做的事情,可以通過以下方式更加簡潔地完成:

$sql_text = "INSERT INTO orders
                  ( id_orders
                  , id_kustomer
                  , nama_kustomer
                  , alamat
                  , telpon
                  , email
                  , tgl_order
                  , jam_order
                  , jasa
                  , id_kota
                  , item
                  , size
                  , kateg_bahan
                  , warna
                  , jumlah
                  , harga
                  , sub_total)
             SELECT NULL AS id_orders"
                  , '".mysql_real_escape_string($id_kustomer)."'
                  , '".mysql_real_escape_string($nama       )."'
                  , '".mysql_real_escape_string($alamat     )."'
                  , '".mysql_real_escape_string($telpon     )."'
                  , '".mysql_real_escape_string($email      )."'
                  , '".mysql_real_escape_string($tgl_skrg   )."'
                  , '".mysql_real_escape_string($jam_skrg   )."'
                  , '".mysql_real_escape_string($jasa       )."'
                  , '".mysql_real_escape_string($id_kota    )."'
                  , c.item
                  , c.size
                  , c.kateg_bahan
                  , c.warna
                  , c.jumlah
                  , c.harga
                  , c.sub_total
               FROM cart c
              WHERE c.id_session='".mysql_real_escape_string(session_id()."'";
//echo "sql_text=".$sql_text; // for debugging
mysql_query($sql_text) or die(mysql_error());

$sql_text = "DELETE FROM keranjang k
              WHERE k.id_session='".mysql_real_escape_string(session_id()."'";
//echo "sql_text=".$sql_text; // for debugging
mysql_query($sql_text) or die(mysql_error());

有人可能認為“死”可能不是最合適的行為,如果我們碰巧正在處理InnoDB表,也許我們處於TRANSACTION的上下文中,並且ROLLBACK可能是合適的。 但似乎我們應該至少做一些努力來確定一個陳述是否拋出和異常。

所有變量現在都包含在對mysql_real_escape_string函數的調用中。 如果這些變量的內容已經被清理過(之前在代碼中),那么我們應該省略對mysql_real_escape_string的調用。 (我通常在包含另一個變量的“已清理”副本的變量名上使用前綴,以明確SQL文本中包含的字符串是否已經被轉義。但這更多地是關於遵循一致的模式來幫助制作“錯誤的代碼看錯了”)


有人不明白“ 棄用 ”是什么意思嗎? 新代碼不應該使用mysql_函數,而應該使用mysqliPDO

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM