0

如何从表中选择行,然后在 php mysql 中输入新表循环以进行计数选择,

以防万一图表。

在 localhost 中,此代码可以找到。但是当我尝试上网时,为什么 WHERE 子句中的第一条记录可以插入到 Orders 表中并像一样删除。

     $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]'");
}
4

2 回答 2

1

很难理解您要实现的目标,但显而易见的是您不必要地使用查询访问数据库。

恕我直言,您的所有代码都可以归结为两个可能看起来像这样的 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学习和使用 准备好的语句

于 2013-07-19T03:05:20.550 回答
1

现有的代码几乎无法破译。它试图完成的“大想法”似乎被许多不必要的操作和大量不必要的 SQL 执行所掩盖。

我们推断,因为该mysql_insert_id()函数返回插入的最后一行的 AUTO_INCREMENT 值。并且这在循环之前调用了一次,并且检索到的值作为列值插入到以下插入中……我们推断这id_orders是其他表的外键,其中一行刚刚插入。

(列名id_orders是表中列的一个奇怪选择orders,对于不是行的唯一标识符的列。如果那是唯一标识符,那么我们预计很多插入语句都会失败重复键异常。

并且鉴于没有检查 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

于 2013-07-19T03:25:12.363 回答