表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));
}
答案 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));
}
}