Reputation: 1521
I have some data from the DB I post on a table. For every line of the table (every loop of the while loop), I need to CALL a stored procedure to calculate the data for the last <td>
of my table.
Here some code:
$s = $lk->query("SELECT *
FROM A_USERS
JOIN A_DATA
WHERE A_DATA.id_user = A_USERS.id
AND A_USERS.usr_att = 1
AND A_DATA.act_data = 1
AND A_DATA.a_att = 1
AND A_DATA.qty IS NOT NULL
ORDER BY ID ASC");
while ($dato = $s->fetch_object()) {
print '<tr>';
print '<td>';
print $dato->id;
print '</td>';
//others cells
$GetP = $lk->query("CALL GetPr($dato->qty, '$dato->prod')");
if(mysqli_num_rows($GetP) === 1){
while($p_db = mysqli_fetch_array($GetP)){
$p = $p_db['p'];
}
$format = number_format(round($p, 1), 2, ',', '\'');
//some other stuff here...
}else{
print '<td>';
print 'ERROR';
print '</td>';
}
print '</tr>';
}
The problem is that ONLY the first loop of the while
calls the procedure which returns 1 row
. Else I get always ERROR
on this <td>
which means the stored procedure didn't return 1 row
.
Why?
EDIT
Stored procedure:
CREATE DEFINER=`...` PROCEDURE `GetPr`(IN `cli_qty` INT, IN `cli_prod` VARCHAR(10) CHARSET ascii)
BEGIN
SET @cli_qty = cli_qty;
SET @q = (SELECT qty FROM MRG_H ORDER BY ABS(@cli_qty - qty) ASC LIMIT 1);
SET @cli_prod = cli_prod;
IF @cli_prod = 'OECO' THEN SET @marg = (SELECT (m+v) FROM MRG_H JOIN DT WHERE m <> '' AND q = @q AND par = 'MarOECO');
ELSE SET @marg = (SELECT m FROM MRG_H WHERE m <> '' AND q = @q);
END IF;
SELECT (Med+@marg)*((Val+100)/100) AS P, D_aaaammgg AS Date
FROM PL
JOIN TVA
WHERE I_D = 0
AND Med <> ''
AND Date_f = ''
ORDER BY Iden DESC
LIMIT 1;
END
MYSQLI ERROR:
Error: 2014-Commands out of sync; you can't run this command now
Upvotes: 1
Views: 2230
Reputation: 1521
With suggestions of @Mihai I found this solution:
Reference: PHP Manual
while ($dato = $s->fetch_object()) {
print '<tr>';
print '<td>';
print $dato->id;
print '</td>';
//others cells
$GetP = $lk->query("CALL GetPr($dato->qty, '$dato->prod')");
if(mysqli_num_rows($GetP) === 1){
while($p_db = mysqli_fetch_array($GetP)){
$p = $p_db['p'];
}
$format = number_format(round($p, 1), 2, ',', '\'');
//some other stuff here...
}else{
print '<td>';
print 'ERROR';
print '</td>';
}
//Added this 2 lines
$GetPrice->close();
$link->next_result();
print '</tr>';
}
Upvotes: 2
Reputation: 26784
No sure this is the problem,but mysqli_fetch_array advances the internal pointer,replace it with mysqli_num_rows instead.
while($p_db = mysqli_fetch_array($GetP)){
$p = $p_db['p'];
}
EDIT:
http://www.php.net/manual/en/mysqli.query.php#102904
$s->close();
$lk->next_result();
Put this 2 under //other cells.
And also,ty replacing fetch_object with fetch_all.
Upvotes: 2