我对PHP很陌生,所以我提前为我发布的任何令人作呕的糟糕代码道歉...
我为健身训练营创建了一个基本的会员系统。我有两个SQL表 - “成员”和“付款”。
我创建了一个表,并使用循环,我可以显示所有成员。现在,我希望能够使用函数checkpayment()检查会员是否付款。
此功能会检查付款表,以查看当前月份和年份内是否有包含该成员ID付款的行。
即使付款已输入付款表,用户仍会显示为未付款。
function checkpayment($memberid, $month, $year){
global $db;
$payments = "SELECT * FROM 'payments' WHERE member_id = :memberid";
$result = $db->prepare($payments);
$result->bindParam(':memberid', $memberid, PDO::PARAM_INT);
$result->bindParam(':month', $month, PDO::PARAM_INT);
$result->bindParam(':year', $year, PDO::PARAM_INT);
return $result->fetchColumn();
}
以下是显示成员的代码:
foreach($db->query('SELECT * FROM `members`') as $row) {
$checkpayment = checkpayment($row['id'],10,2014);
if(!$checkpayment){
$status = "danger";
$paid = "Unpaid";
} else {
$status = "success";
$paid = "Paid";
}
echo '<tr class="'. $status .'">
<td>'. $row['id'] .'</td>
<td>' . $row['first_name'] . '</td>
<td>' . $row['last_name'] .'</td>
<td>' . $paid . '</td>
<td>' . $row['programme'] . '</td>
</tr>';
}
但是,即使付款行存在,成员仍然显示为未付款...
答案 0 :(得分:3)
如果您使用的是prepare
功能,则据我所知,您必须使用execute()
。尝试下面,如果不行,我将更新。
Here您可以看到有关execute()
function checkpayment($memberid, $month, $year){
global $db;
$payments = "SELECT * FROM payments WHERE member_id = :memberid";
$result = $db->prepare($payments);
$result->bindParam(':memberid', $memberid, PDO::PARAM_INT);
$result->execute();//ADD This line
return $result->fetchColumn();
}
答案 1 :(得分:2)
您在查询中使用了错误的引号:
$payments = "SELECT * FROM 'payments' WHERE member_id = :memberid";
应该是:
$payments = "SELECT * FROM payments WHERE member_id = :memberid";
或:
$payments = "SELECT * FROM `payments` WHERE member_id = :memberid";
您应该只绑定您实际使用的变量,在这种情况下为:memberid
或将其他变量添加到您的查询中。在你的情况下,你显然应该做后者。
要捕获这些错误,您应该设置PDO以抛出异常。您可以通过在打开数据库连接后立即添加此功能来执行此操作:
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
答案 2 :(得分:1)
您正在选择*返回多列,然后选择PDOStatement :: fetch_column,它只返回第一列。由于这可能是成员id,因此结果将始终为真。
或者至少如果你在尝试读取结果之前实际上调用了$ result-&gt; execute()就行了! ; - )
这是加入的绝佳机会:
$month = 1;
$year = 2014;
$pdo = new PDO ("mysql:host=localhost;dbname=test", "xxx", 'xxx');
$sel = $pdo->prepare ("select * from member as m
left join payments as p
on m.member_id = p.member_id
and p.month = :month
and p.year = :year");
$sel->bindParam('month', $month, PDO::PARAM_INT);
$sel->bindParam('year', $year, PDO::PARAM_INT);
$sel->execute ();
var_dump ($sel->fetchAll ());
结果:
array(2) {
[0]=>
array(5) {
["member_id"]=>string(1) "1"
["member_name"]=>string(4) "Good"
["pmember_id"]=>string(1) "1"
["year"]=>string(4) "2014"
["month"]=>string(1) "1"
}
[1]=>
array(5) {
["member_id"]=>string(1) "2"
["member_name"]=>string(8) "Deadbeat"
["pmember_id"]=>NULL
["year"]=>NULL
["month"]=>NULL
}
}
如您所见,所有未支付指定月份和年份的成员都有一个pmember_id,年份和月份为NULL。
我在付款查询中更改了member_id的名称,以便fetchAll适用于此插图。