Javascript else语句逻辑未运行
我有一个名为Javascript else语句逻辑未运行,javascript,php,jquery,ajax,Javascript,Php,Jquery,Ajax,我有一个名为goals的数据库表。默认情况下,用户在此表中没有记录,只有在创建目标时才会有记录。然后我有一个进度条,它显示了目标竞争的进度。我最初遇到的问题是这些值是未定义的,因此我尝试向其中添加逻辑来计算行数,如果大于0,则发送调整后的变量,如果不大于0,则发送0。出于某种原因,if条件似乎始终在运行。我认为是这样,因为它试图运行代码的分割行: $goal_completion_rate = $actual_status / $total_status ; $goal_comp
goals
的数据库表。默认情况下,用户在此表中没有记录,只有在创建目标时才会有记录。然后我有一个进度条,它显示了目标竞争的进度。我最初遇到的问题是这些值是未定义的,因此我尝试向其中添加逻辑来计算行数,如果大于0,则发送调整后的变量,如果不大于0,则发送0。出于某种原因,if条件似乎始终在运行。我认为是这样,因为它试图运行代码的分割行:
$goal_completion_rate = $actual_status / $total_status ;
$goal_completion_rate_percentage = round((float)$goal_completion_rate * 100) . '%';
$result = array('total_goals' => $total_status, 'goals_completed' => $actual_status, 'completion_percentage' => $goal_completion_rate_percentage);
以下是错误:
<b>Warning</b>: Division by zero in <b>/</b> on line <b>26</b><br />
{"total_goals":"0","goals_completed":null,"completion_percentage":"0%"}
阿贾克斯
sql将始终返回一行。聚合函数确保了这一点。如果没有要报告的目标,count(*)函数将在该行中返回0,sum()函数将返回null。因此,
$goal\u count
将始终为1,实际上不是用户的目标记录计数。实际保存目标记录数的变量是$total\u status
。您应该测试sql是否总是返回一行,而不是$goal\u count
。聚合函数确保了这一点。如果没有要报告的目标,count(*)函数将在该行中返回0,sum()函数将返回null。因此,$goal\u count
将始终为1,实际上不是用户的目标记录计数。实际保存目标记录数的变量是$total\u status
。您应该测试它,而不是$goal\u count
首先,if($goal\u total\u stmt=$con->prepare($goal\u total\u sql)){
您分配的是=
而不是测试是否相等=
或==
显然,$actual\u状态是在满足触发if语句的条件后触发错误的。您需要做的是测试$actual\u状态,然后再除以它,从而触发if语句。=/code>在作业中,==
和==
是比较的。我从ifif($goal\u total\u stmt=$con->prepare($goal\u total\u sql)){
中取出了这个($goal\u total\u stmt=$con->prepare($goal\u total\u sql)
好,首先,if($goal\u total\u stmt=$con prepare($goal\u total\u sql)){
您分配的是=
而不是测试是否相等=
或==
显然,$actual\u状态是在满足触发if语句的条件后触发错误的。您需要做的是测试$actual\u状态,然后再除以它,从而触发if语句。=/code>是作业,==
和==
是比较的。我从ifif($goal\u total\u stmt=$con->prepare($goal\u total\u sql)){
中取出了这个
多亏了这个技巧!现在唯一的一件事是,我的进度条抛出了一堆未定义的错误,因为它的值是0。有没有办法让它在没有所有错误的情况下读取0?当没有目标时,不要将$result
设置为0
,试着将它设置为数组('total_goals'=>1,'goals_completed'=>1,'completion_percentage'=>100%);
。或者您可以使用0
而不是1
。这实际上就是我所做的。我忘了更新代码。下面是我写的:$result=array('total_goals'=>0,'goals_completed'=>0,'completion_percentage'=>0)
在你的javascript中有goals\u completed/total\u goals
,如果你使用0
而不是1
,这会给你一个被零除的错误。也许你应该使用var-total\u-goals=Math.max(result.total\u-goals,1);
谢谢。我这样做了,如果(total\u-goals>=1){bar.animate),它就成功了(目标完成/总目标);}其他{bar.animate(0);}非常感谢您的帮助。感谢您的帮助!现在唯一的问题是,由于值为0,我的进度条抛出了一堆未定义的错误。有没有办法让它在没有所有错误的情况下读取0?当没有目标时,不要将$result
设置为0
,尝试将其设置为数组('total_goals'=>1,'goals_completed'=>1,'completion_percentage'=>100%);
。或者您可以使用0
而不是1
。这实际上就是我所做的。我忘了更新代码。下面是我写的:$result=array('total_goals'=>0,'goals_completed'=>0,'completion_percentage'=>0)
在你的javascript中有goals\u completed/total\u goals
,如果你使用0
而不是1
,这会给你一个被零除的错误。也许你应该使用var-total\u-goals=Math.max(result.total\u-goals,1);
谢谢。我这样做了,如果(total\u-goals>=1){bar.animate),它就成功了(goals_completed/total_goals);}其他{bar.animate(0);}我感谢您的帮助。
$goal_total_sql = "
SELECT sum(status) as sumna,
COUNT(*) as cnt
FROM goals
WHERE user_id = ?
";
$total_status = 0;
$actual_status = 0;
$goal_completion_rate_percentage = 0;
$goal_count = 0;
if ($goal_total_stmt = $con->prepare($goal_total_sql)) {
$goal_total_stmt->execute(array($user_id));
$rows = $goal_total_stmt->fetchAll(PDO::FETCH_ASSOC);
$goal_count = $goal_total_stmt->rowCount();
foreach ($rows as $row) {
$actual_status = $row['sumna'];
$total_status = $row['cnt'];
}
}
if ($goal_count > 0) {
$goal_completion_rate = $actual_status / $total_status ;
$goal_completion_rate_percentage = round((float)$goal_completion_rate * 100) . '%';
$result = array('total_goals' => $total_status, 'goals_completed' => $actual_status, 'completion_percentage' => $goal_completion_rate_percentage);
echo json_encode($result);
}
else {
$result = 0;
echo json_encode($result);
}
function goalBar(){
$.ajax({
url: "ajax-php/goal-bar.php",
type: "get",
dataType : 'json',
success: function (result) {
//console.log(result);
if (result == "Error!") {
alert("Unable to retrieve goal bar info!");
alert(result);
} else {
var total_goals = result.total_goals;
var goals_completed = result.goals_completed;
var goal_percent = result.completion_percentage;
var percent_symbol = '%';
$('#total-goals').html(total_goals);
$('#goals-completed').html(goals_completed);
$('#goal-percentage').html(goal_percent);
var bar = new ProgressBar.Circle('#goal-bar-container', {
color: '#aaa',
// This has to be the same size as the maximum width to
// prevent clipping
strokeWidth: 8,
trailWidth: 2,
easing: 'easeInOut',
duration: 1400,
text: {
autoStyleContainer: false
},
from: { color: '#aaa', width: 1 },
to: { color: '#38c', width: 6 },
// Set default step function for all animate calls
step: function(state, circle) {
circle.path.setAttribute('stroke', state.color);
circle.path.setAttribute('stroke-width', state.width);
var value = Math.round(circle.value() * 100);
if (value === 0) {
circle.setText('0');
} else {
circle.setText(value);
}
}
});
bar.text.style.fontFamily = '"Raleway", Helvetica, sans-serif';
bar.text.style.fontSize = '2rem';
bar.animate(goals_completed/total_goals); // Number from 0.0 to 1.0
}
},
error: function (xhr, textStatus, errorThrown) {
alert(textStatus + " | " + errorThrown);
console.log("error"); //otherwise error if status code is other than 200.
}
});
}
goalBar();