在函数中访问数据VIA PDO - PHP

时间:2014-10-08 21:25:47

标签: php mysql pdo

我对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>';

            }

但是,即使付款行存在,成员仍然显示为未付款...

3 个答案:

答案 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适用于此插图。