Home > Net >  SELECT into a foreach return previous values
SELECT into a foreach return previous values

Time:01-05

I have a document classification table based on user role, for example:

workforce_class_worker_doc_id workforce_class_worker_doc_role_id workforce_class_worker_doc_description
1 1 Drive license
2 1 Contract

A worker table

workforce_worker_id workforce_worker_name workforce_role_id
1 John Doe 1

And a workforce_docs where are uploaded pdf

workforce_doc_id workforce_doc_worker_id workforce_doc_class_id workforce_doc_valid_from workforce_doc_valid_to
1 1 1 2022-01-01 2022-01-31

I'm trying to get with foreach document classification and with a new select get document document validity

<table >
    <tbody>
        <?php
            foreach ($data as $row) {
            $workforce_class_worker_doc_id = $row['workforce_class_worker_doc_id'];
            $workforce_class_worker_doc_description = $row['workforce_class_worker_doc_description'];

            $stmt = $conn->prepare(' SELECT workforce_doc_class_id, workforce_doc_valid_from, workforce_doc_valid_to
                                       FROM workforce_docs
                                      WHERE workforce_doc_class_id = ?
                                        AND workforce_doc_worker_id = ? ');
            $stmt->bind_param('ii', $workforce_class_worker_doc_id, $workforce_worker_id);
            $stmt->execute();
            $stmt->bind_result( $workforce_doc_class_id, $workforce_doc_valid_from, $workforce_doc_valid_to ); 
            $stmt->fetch();
            $stmt->close();
        ?>

            <tr>
                <th><?php echo $workforce_class_worker_doc_description; ?></th>
                <th><?php echo $workforce_doc_valid_from; ?></th>
                <th><?php echo $workforce_doc_valid_to; ?></th>
                <td><button >  Update Document</button></td>
            </tr>

        <?php
            }
        ?>
    </tbody>
</table>

I'm experiencing a trouble with foreach, i expect result like this:

Drive License 2022-01-01 2022-01-31
Contract

But my result is

Drive License 2022-01-01 2022-01-31
Contract 2022-01-01 2022-01-31

seem get previous variables, need must be blank because i not have record on doc table

CodePudding user response:

I suggest to make a LEFT JOIN before that, query is simply and more faster

// in your foreach query your query add
LEFT JOIN workforce_docs ON workforce_doc_class_id = workforce_class_worker_doc_id

and change your foreach to:

 foreach ($data as $row) {
     $workforce_class_worker_doc_id = $row['workforce_class_worker_doc_id'];
     $workforce_class_worker_doc_description = $row['workforce_class_worker_doc_description'];
     $workforce_doc_valid_from = $row['workforce_doc_valid_from'];
     $workforce_doc_valid_to = $row['workforce_doc_valid_to'];
     ... rest of the code ...

CodePudding user response:

Here's the issue:

$stmt->fetch();

This doesn't have result on the second run, therefore

$stmt->bind_result( $workforce_doc_class_id, $workforce_doc_valid_from, $workforce_doc_valid_to ); 

Is not executed. This would make $workforce_doc_class_id, $workforce_doc_valid_from, $workforce_doc_valid_to to have previous value.

I would suggest to reset value prior to that line:

foreach ($data as $row) {
    $workforce_doc_class_id = '';
    $workforce_doc_valid_from = '';
    $workforce_doc_valid_to = '';
    ...
    //rest of the code
  •  Tags:  
  • Related