我正在尝试添加3个SQL查询的结果。所有3个查询都返回整数值。
如何将3个SQL查询的结果添加到变量中并回显它? 代码:
<?php
define('HOST','mywebsite.com');
define('USER','username');
define('PASS','password');
define('DB','imagebase');
$con=mysqli_connect(HOST,USER,PASS,DB);
if($_SERVER['REQUEST_METHOD']=='POST'){
$val1=$_POST['sval1'];
$val2=$_POST['sval2'];
$val3=$_POST['sval3'];
$sql="select price from images where name='$val1'"; //returns 100
$sql1="select price from images where name='$val2'"; //returns 100
$sql2="select price from images where name='$val3'"; //returns 100
$result=mysqli_query($con,$sql);
$count=mysqli_num_rows($result);
$result1=mysqli_query($con,$sql1);
$count1=mysqli_num_rows($result1);
$result2=mysqli_query($con,$sql2);
$count2=mysqli_num_rows($result2);
if ($count==1) {
$res1=$count;
}
if ($count1==1) {
$res2=$count;
}
if ($count2==1) {
$res3=$count;
}
$final=$res1+$res2+$res3; //should return 300 but returns 3
echo $final;
mysqli_close($con);
} else {
echo 'Error Updating Price';
mysqli_close($con);
}
?>
答案 0 :(得分:1)
警告有问题的代码对SQL注入是脆弱的!不要这样做。 SQL文本中包含的任何可能不安全的值必须才能正确转义。首选模式是使用带有绑定占位符的预准备语句。
要解决所提出的具体问题:我们需要从结果集中fetch
行,并累积为价格返回的值。
看起来我们不关心返回的行数;通过每个查询,所以没有理由调用num_rows函数。
$tot = 0;
$result=mysqli_query($con,$sql);
while( $row = $result->fetch_assoc() ) {
$tot += $row['price'];
}
$result1=mysqli_query($con,$sql1);
while( $row = $result1->fetch_assoc() ) {
$tot += $row['price'];
}
$result2=mysqli_query($con,$sql2);
while( $row = $result2->fetch_assoc() ) {
$tot += $row['price'];
}
echo "tot = " . $tot;
但为什么要运行三个单独的查询呢?如果我们想要的是一个总数,我们可以让MySQL为我们计算。
此外,面向对象的模式比程序模式容易得多。
$sql = 'SELECT SUM(i.price) AS tot_price
FROM images i
WHERE i.name IN ( ? , ? , ? )';
if( $sth = $con->prepare($sql) ) {
$sth->bind_param('sss',$val1,$val2,$val3);
if( $sth->execute() ) {
$sth->bind_result($tot_price);
if( $sth->fetch() ) {
echo "tot_price = " . $tot_price;
} else {
// no row returned
}
$sth->close();
} else {
// handle error in execute
} else {
// handle error in prepare
}
答案 1 :(得分:0)
在if语句中,您忘记在第二和第三语句中将$count
更改为$count1
和$count2
。
此外,您确定要检查$count, $count1, $count2
是否等于1吗?
您可能想要检查这些变量是否具有假值if($count)
等。
之后,您需要在if语句之前将$res1, $res2, $res3
初始化为0,否则可能会在以后汇总由于之前的falsy if语句而未初始化的$res
变量时出现错误。