[英]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注入攻擊。 使用PDO或MySQLi學習和使用預 准備語句 。
現有代碼幾乎無法解讀。 它試圖完成的“大創意”似乎被許多不必要的操作所掩蓋,以及整個大量不必要的SQL執行。
我們推斷,因為mysql_insert_id()
函數返回插入的最后一行的AUTO_INCREMENT值。 並且在循環之前調用一次,並且檢索的值作為列值插入到以下插入中...我們推斷id_orders
是其他表的外鍵,其中只插入了一行。
(列名id_orders
是orders
表中列的奇怪選擇,對於不是行的唯一標識符的列。如果這是唯一標識符,那么我們期望很多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_函數,而應該使用mysqli或PDO 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.