PDO: unbufferred queries error - php

I understand that this error is generated by a cursor being left open (not consuming all data). However, I thought I had suitably accounted for this by explicitly closing the cursor in my function. Nonetheless I am getting the error message
SQLSTATE[HY000]: General error: 2014 Cannot execute queries while
other unbuffered queries are active.
Specifically this is being triggered when $setting ==0.
What am I doing wrong?
<?php function selector($dbh, $selectString, &$callnumber, $setting)
{
$callnumber++;
try{
$sth = $dbh->prepare($selectString);
$sth->execute();
if ($setting==0){
$results = $sth->fetch(PDO::FETCH_ASSOC);
$sth->closeCursor();
return $results;
}
else if ($setting==1){
$moduleselect = array();
while ($results = $sth->fetch(PDO::FETCH_ASSOC)) {
$moduleselect[] = $results;
$sth->closeCursor();
}
return $moduleselect;
}
}
catch (PDOException $e) {
echo($e->getMessage());
echo ("ref= ".$callnumber);
$dhh=null;
die();
}
}
?>

Related

Getting "SQLSTATE[HY000]: General error" when running my PHP app

Good day!
I am working on building a dummy application form that inserts data to a mySQL database. When running the functions, I successfully insert the data into the database. However, when the functions worked successfully, I am getting an error SQLSTATE[HY000]: General error
I thought it was occurring within my database access function, but it seems to be connecting alright. Here is my db access function:
function connectToDB($params)
{
try
{
$conn = new PDO('mysql:host=localhost;dbname=test', 'root', '');
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $conn->prepare($params['sql']);
$stmt->execute($params['bindParam']);
$results = array();
$results['rowCount'] = $stmt->rowCount();
if($results['rowCount'] == 1)
{
$results = $stmt->fetch(PDO::FETCH_ASSOC);
return $results;
} elseif($results['rowCount'] < 2) {
$results = $stmt->fetch(PDO::FETCH_ASSOC);
return $results;
} elseif($results['rowCount'] > 2) {
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
return $results;
} elseif($results['rowCount'] == 2) {
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
return $results;
}
} catch (PDOException $e) {
echo "Connection failed: " . $e->getMessage();
}
return $params;
}
Is there something I am missing in my code or is there something that shouldn't be in my db access code? I hope to learn from this to apply it in the future while I'm still trying to learn/improve on my PHP along the way. I hope I did my best to explain my issue and I appreciate your time reading!
Thank you
You do not use fetchAll().
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
with insert queries. Removing this statement it should fix your problem. Remember every fetch and fetchAll from your code.

How to execute multiple queries using PDO for Sql Server

I'd like to execute some queries that doesn't return result set, and then execute a real query, and fetch its result.
Here is an exemple that doesn't work :
<?php
try {
$db = new PDO('dblib:host=myhost;dbname=master','user','password');
$query = "declare #entier int = 1;";
$db->exec($query);
$query = "select #entier;";
$stmt = $db->query($query);
$rows = $stmt->fetchAll();
print_r($rows);
}
catch (PDOException $e) {
print ($e->getMessage());
}
catch (Exception $e) {
print ($e->getMessage());
}
?>
This code neither doesn't work :
try {
$db = new PDO('dblib:host=myhost;dbname=master','user','password');
$query = "declare #entier int = 1; select #entier;";
$stmt = $db->query($query);
$rows = $stmt->fetchAll();
print_r($rows);
}
catch (PDOException $e) {
print ($e->getMessage());
}
catch (Exception $e) {
print ($e->getMessage());
}
?>
But this code works :
<?php
try {
$db = new PDO('dblib:host=myhost;dbname=master','user','password');
$query = "select 1;";
$stmt = $db->query($query);
$rows = $stmt->fetchAll();
print_r($rows);
}
catch (PDOException $e) {
print ($e->getMessage());
}
catch (Exception $e) {
print ($e->getMessage());
}
?>
Thanks for your help
I know this is old, but for other people finding this from Google: you need to use PDOStatement::nextRowset to iterate over the result sets from your multiple queries.
However, it seems there are memory issues when using nextRowset with dblib in some versions (it tried to allocate 94Tb in my case...), so I ended up re-engineering to avoid multiple SQL queries altogether (instead duplicating the value of the DECLARE where it was being used).
PDO::query docs (http://php.net/manual/it/pdo.query.php) say
PDO::query() executes an SQL statement in a single function call, returning the result set (if any) returned by the statement as a PDOStatement object.
This could mean that you can execute with query() both queries with and without result

Sqlite PDO query returns no results

Getting no results no matter how broad my query
PHP: 5.3
Sqlite3: 3.6
PDO: 5.3.3
I would think this should be a very simple process but even looking around I still don't know why I'm getting 0 results. Here is my code:
<?php
$sqlite = new PDO('sqlite:/example.db');
$result = $sqlite->query('SELECT * from foo');
if(!$result)
{
echo 'fail';
return false;
}
?>
Any ideas on what I am doing wrong? The 'foo' table will only have four columns, and this test db only has one table. Running the query in sqlite displays the results fine.
You have to execute the statement first than fetch the result.
You might add try/catch block around the execute method call. and do some error handling.
Here's an example of catching an Exception. Do not use it as a design guideline.
<?php
try
{
$sqlite = new PDO('sqlite:/example.db');
}
catch (PDOException $e)
{
echo 'Connection failed: ' . $e->getMessage();
}
$statement = $sqlite->prepare('SELECT * from foo');
try
{
$statement->execute();
}
catch(PDOException $e)
{
echo "Statement failed: " . $e->getMessage();
return false;
}
$result = $statement->fetchAll();
var_dump($result);
?>

Cannot catch oracle exception from oracle stored procedure using php oci

Does anyone know how to catch oracle exception in php?
I have a stored procedure which raise exceptions when something occur and I want to pass the message directly to browser. I have tried using try catch and oci_error but still unable to catch the exception. I want to catch something like this from oracle stored procedure
RAISE_APPLICATION_ERROR(-20101, 'SOME EXCEPTION');
and send 'SOME EXCEPTION' to browser.
In the php code I'm using codeigniter but I could not call the procedure using the driver provided by it so I make my own function. It's quite similar to the one provided by codeigniter but I don't know why mine works. Here is the function to call the stored procedure
public function oci_procedure_call($package_name, $proc_name, $param)
{
$sql = "begin $package_name.$proc_name(";
foreach ($param as $p) {
$sql .= $p['name'] . ',';
}
$sql = trim($sql, ',') . '); end;';
$stmt = oci_parse($this->db->conn_id, $sql);
foreach ($param as $p) {
oci_bind_by_name($stmt, $p['name'], $p['value'], $p['length'], $p['type']);
}
try {
$r = oci_execute($stmt);
} catch (Exception $e) {
log_message('info', print_r($e, true));
}
if (!$r) {
$e = oci_error($this->db->conn_id);
return $e['message'];
} else {
return true;
}
}

I want to get the exact message out of this error

I understand I have to include mysql_errno y mysql_error here somewhere instead of 'Query Failed' and I tried with $results as an argument but i have not found out how.
If someone can help me out, thanks:
static function execSQl2($query)
{
/*
Execute a SQL query on the database
passing the tablename and the sql query.
Returns the LAST_INSERT_ID
*/
$db = null;
$lastid = null;
//echo "query is $query";
try
{
$db = Model::getConnection();
$results = $db->query($query);
if(!$results) {
throw new Exception('Query failed', EX_QUERY_FAILED);
}
$lastid = $db->insert_id;
}
catch(Exception $e)
{
/* errors are handled higher in the
object hierarchy
*/
throw $e;
}
Model::closeConnection($db);
return $lastid;
}
throw new Exception(mysql_error(), EX_QUERY_FAILED);

Categories