在php mysql中如何从表中选择行,然后输入到新的表循环中进行计数选择
以防作图。
在localhost中,这段代码可以找到。但是当我尝试联机时,为什么WHERE子句中的第一条记录可以插入到Orders表和dlete中,比如as。
$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]'");
}发布于 2013-07-19 11:05:21
很难理解您试图实现的目标,但显而易见的是,您不必要地使用查询来访问数据库。
我想您的所有代码都可以归结为两个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学习和使用prepared statements。
发布于 2013-07-19 11:25:12
现有的代码几乎无法辨别。它试图实现的“大想法”似乎被许多不必要的操作和大量不必要的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表,也许我们处于事务的上下文中,回滚可能是合适的。但似乎我们至少应该做出一些努力来确定语句是否抛出和异常。
现在,所有变量都封装在对mysql_real_escape_string函数的调用中。如果这些变量的内容已经被清理(之前在代码中),那么我们应该省略对mysql_real_escape_string的调用。(我通常在包含另一个变量的“净化”副本的变量名上使用前缀,以明确包含在SQL文本中的字符串是否已被转义。但这实际上更多的是遵循一个一致的模式,帮助“错误的代码看起来是错误的”)。)
有没有人不明白“弃用的”是什么意思?新代码不应该使用mysql_函数,而应该使用mysqli或PDO。
https://stackoverflow.com/questions/17736951
复制相似问题