使用表2行更新表1行表2必须从数据库中获取

时间:2017-04-19 14:38:50

标签: php mysql

表1(需要更新)

+-----------------+
|name    |qty     | 
+-----------------+
|area    | 1      |
|length  | 2      |
|breadth | 3      |
|width   | 4      |
+-----------------+

表格需要获取哪些值和行必须更新

+-------------------------------------+
|name    | upd_qty | Cart_id |  cid   |
+-------------------------------------+
|area    | 6       |   12    |  1     |
|length  | 8       |   20    |  2     |
|breadth | 11      |   34    |  3     |
+-------------------------------------+

我怎么能用PHP做到这一点。请帮帮我。 这是我用于原创作品的代码。表1和表1表2有共同的名称,条件是 1。对于从table获取到where where条件的行,应该执行UPDATE。 2.表2 upd_qty将在表2中更新,同时从表2中获取条件数据。

$con=mysqli_connect("localhost","root","","medical");
 // Check connection 
   if (mysqli_connect_errno())
 {
echo "Failed to connect to MySQL: " . mysqli_connect_error();
 }
 error_reporting(E_ALL ^ E_NOTICE);
 $query = "SELECT * FROM cart WHERE cid='$id' AND 'cart'='$cart_id'";
 $result = $con->query($query);

while($row = $result->fetch_assoc()) {
    $mediname = $row['name'];
    $mediqty = $row['upd_qty'];
  for($i=0;$i<$count;$i++){
 $sql="UPDATE stock SET qty='$mediqty' WHERE name='$mediname' AND 
'cart'='$cart_id'";

 if (!mysqli_query($con,$sql)) 
 {
  die('Error: Failed' . mysqli_error($con));
  } 

2 个答案:

答案 0 :(得分:0)

我认为你不需要这一行:

for($i=0;$i<$count;$i++){

已经是&#34;而fetch&#34;循环。

此外,请勿在标识符周围使用单引号,如果需要转义标识符,请使用反引号。

有了这个:

  ... AND 'cart' = ...  

'cart'将被评估为字符串文字,而不是列引用。

有了这个

  ... AND `cart` = ...  

cart是一个标识符,是对列的引用。

此外,如果我们不能使用带有绑定占位符的预准备语句,我们至少使用mysqli_real_escape_string来缓解SQL注入漏洞

此外,程序风格和面向对象的风格调用混合在一起令人困惑......

程序式

mysqli_query($con,$sql)
mysqli_error($con)

面向对象的风格

$con->query($query)
$result->fetch_assoc()

我建议您选择一种风格或另一种风格,并坚持使用该模式。

  $query = "SELECT * FROM cart WHERE `cid` = '" 
     . $con->real_escape_string($id)
     . "' AND `cart` = '" 
     . $con->real_escape_string($cart_id)
     . "'";
  $result = $con->query($query);
  if( !$result ) {
      die('Error: ' . $con->error());
  }

  while( $row = $result->fetch_assoc() ) {
     $mediname = $row['name'];
     $mediqty  = $row['upd_qty'];

     $sql="UPDATE stock SET `qty` = '"
        . $con->real_escape_string($mediqty)
        . "' WHERE `name` = '"
        . $con->real_escape_string($mediname)
        . "' AND `cart` = '" 
        . $con->real_escape_string($cart_id)
        ."'";

     if(!$con->query($sql) ) {
        die('Error: Failed' . $con->error());
     }
  }

修改

如果没有特定的循环原因,如果目标只是执行UPDATE操作而没有其他逻辑或条件,我们可以在一个语句中执行UPDATE,而不需要多个查询执行:

 UPDATE cart c
   JOIN stock s
     ON s.cart = c.cart
    AND s.name = c.name
    SET s.qty = c.upd_qty
  WHERE c.cid = ?
    AND c.cart = ?

就个人而言,我只会使用预准备语句

执行一个UPDATE语句
// connect to mysql
$con = new mysqli(...)
if( $con->connect_error ) {
  die( 'Connect error: ' . $con->connect_error );
}

// update statement
$sql = '
 UPDATE cart c
   JOIN stock s
     ON s.cart = c.cart
    AND s.name = c.name
    SET s.qty = c.upd_qty
  WHERE c.cid = ?
    AND c.cart = ? ';

$sth = $con->prepare($sql);
if(!$sth) {
   die( 'Prepare error: ' . $con->error() );
}
$sth->bind_param('ii',$id,$cart_id);
if(!$sth->execute()) {
  die( 'Execute error: ' . $con->error() );
}

答案 1 :(得分:0)

代码对我来说完全符合我的要求:

$con=mysqli_connect("localhost","root","","medical");
 // Check connection 
   if (mysqli_connect_errno())
 {
echo "Failed to connect to MySQL: " . mysqli_connect_error();
 }
 error_reporting(E_ALL ^ E_NOTICE);
 $query = "SELECT * FROM cart WHERE cid='$id' AND cart='$cart_id'";
 $result = $con->query($query);


while($row1 = $result->fetch_assoc()) 
foreach ($result as $row1){
    $sql="UPDATE stock SET qty='$row1[upd_qty]' WHERE name='$row1[name]'";
     if (!mysqli_query($con,$sql)) 
 {
  die('Error: Failed' . mysqli_error($con));
  } 

}