0

I am trying to run a SQL statement within a while loop, using the variable $id set in the previous statement but am struggling to get it working. If I remove the statement in the while loop I can see the while loop is functioning as it displays the $id variable multiple times:

$businessPark = $_SESSION['businessPark'];
$num = "1";
$stmt = $conn->prepare("SELECT CompanyId from Portal.services WHERE ".$businessPark."  = ?");
$stmt->bind_param("s", $num);
$stmt->execute(); 
$stmt->bind_result($id);

while ($stmt->fetch()) {

    echo "ID: " . $id . "<br>";

}

However when I add the SQL statement back in, I am presented with only the first $id result. If I add in $stmt->close(); at the start of the while loop I do get the first company name, but then the while loops ends. Here is the code:

$businessPark = $_SESSION['businessPark'];
$num = "1";
$stmt = $conn->prepare("SELECT CompanyId from Portal.services WHERE ".$businessPark."  = ?");
$stmt->bind_param("s", $num);
$stmt->execute(); 
$stmt->bind_result($id);

while ($stmt->fetch()) {

    $sql = $conn->prepare("SELECT CompanyName from phpipam.ipaddresses WHERE id = ?");
    $sql->bind_param("s", $id);
    $sql->execute(); 
    $sql->bind_result($CompanyName);
    $sql->fetch();
    echo $CompanyName;
}

Any ideas please?

Update: If I add in a store result before the loop and free result inside the loop I get the first company name and also get the "finished loop" echo:

    $businessPark = $_SESSION['businessPark'];
$num = "1";
$stmt = $conn->prepare("SELECT CompanyId from Portal.services WHERE ".$businessPark."  = ?");
$stmt->bind_param("s", $num);
$stmt->execute(); 
$stmt->bind_result($id);
$stmt->store_result();
while ($stmt->fetch()) {
$stmt->free_result();
$sql = $conn->prepare("SELECT CompanyName from phpipam.ipaddresses WHERE id = ?");
$sql->bind_param("s", $id);
$sql->execute(); 
$sql->bind_result($CompanyName);
$sql->fetch();
echo $CompanyName;

}

echo "finished the loop";

}

Thanks.

15
  • It looks to me like you are trying to access 2 different databases using the same connection? Is that what you are doing Commented Oct 27, 2016 at 8:58
  • you need different connection string for different database Commented Oct 27, 2016 at 9:00
  • @JYoThI not technically true - you can either reference the schema directly or use mysqli::select_db() to chop and change - different database servers however. Commented Oct 27, 2016 at 9:02
  • I don't see that you've set the ID variable, so maybe it's being set somewhere else? Commented Oct 27, 2016 at 9:03
  • I'm still trying to figure out why this hasn't just fallen over with a commands out of synch error personally... I think I need more coffee. Commented Oct 27, 2016 at 9:03

3 Answers 3

1

Cant comment so answering here.

I think you need to use $stmt->bind_param("s", $businessPark); instead of $stmt->bind_param("s", $num);

Sign up to request clarification or add additional context in comments.

1 Comment

I dont think this is right, he uses $businessPark to key the first select which gets him the id he want to use in the second select
0

I had it working (albeit with different queries) on my test server - I'm pretty sure the issue is that you need to pass the resultset through to PHP so that you can prepare the second statement (which must be outside the loop) - otherwise sql = $conn->prepare( ... ); fails and returns false.

This should work:

$businessPark = $_SESSION['businessPark'];
$num = "1";

//first statement
$stmt = $conn->prepare("SELECT CompanyId from Portal.services WHERE ".$businessPark."  = ?");
$stmt->bind_param("s", $num);
$stmt->execute(); 
$stmt->bind_result($id);

//pass the result to PHP so you can prepare a new statement
$stmt->store_result();

//second statement
$sql = $conn->prepare("SELECT CompanyName from phpipam.ipaddresses WHERE id = ?");

while ($stmt->fetch()) {
    $sql->bind_param("s", $id);
    $sql->execute(); 
    $sql->bind_result($CompanyName);
    $sql->fetch();

    echo $CompanyName;
}

//clean up
$stmt->free_result();
$stmt->close();

Comments

0

You can accomplish what you want with a join. I know that this does not answer why your code is not working but in my opinion it's a better solution anyway.

$businessPark = $_SESSION['businessPark'];
$num = "1";
$stmt = $conn->prepare("
SELECT t2.CompanyName
FROM Portal.services t1
INNER JOIN phpipam.ipaddresses t2 ON t1.CompanyId = t2.id
WHERE " . $businessPark . " = ?
");
$stmt->bind_param("s", $num);
$stmt->execute(); 
$stmt->bind_result($companyName);

More information about join syntax

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.