This query returns 5 results in phpMyAdmin:
SELECT * FROM tbl_product WHERE 1 ORDER BY last_update DESC LIMIT 0,5
And this returns count = 12 in phpMyAdmin (this is normal because there are 12 entries):
SELECT COUNT(*) AS count FROM tbl_product WHERE 1 ORDER BY last_update DESC LIMIT 0,5
This function worked fine before I added two variables (offset, display), but now it will not work, and printing the variables leads to offset = 0, display = 5 (so what else LIMIT 0,5).
function getProducts($offset, $display) {
$sql = "SELECT * FROM tbl_product WHERE 1 ORDER BY last_update DESC LIMIT ?,?;";
$data = array((int)$offset, (int)$display);
$rows = dbRowsCount($sql, $data);
logErrors("getProducts(".$offset.",".$display.") returned ".$rows." rows.");
if ($rows > 0) {
dbQuery($sql, $data);
return dbFetchAll();
} else {
return null;
}
}
It does not work, because my method dbRowsCount(...)returned an empty string (stupidity PDOStatement::fetchColumn), so I changed it to return the counter with PDO::FETCH_ASSOCand it returns count = 0.
Here is a function that performs line counting:
function dbRowsCount($sql, $data) {
global $db, $query;
$regex = '/^SELECT\s+(?:ALL\s+|DISTINCT\s+)?(?:.*?)\s+FROM\s+(.*)$/is';
if (preg_match($regex, $sql, $output) > 0) {
$query = $db->prepare("SELECT COUNT(*) AS count FROM {$output[1]}");
logErrors("Regex output: "."SELECT COUNT(*) AS count FROM {$output[1]}");
$query->setFetchMode(PDO::FETCH_ASSOC);
if ($data != null) $query->execute($data); else $query->execute();
if (!$query) {
echo "Oops! There was an error: PDOStatement returned false.";
exit;
}
$result = $query->fetch();
return (int)$result["count"];
} else {
logErrors("Regex did not match: ".$sql);
}
return -1;
}
My error log gives me this result from the program:
: SELECT COUNT (*) AS count FROM tbl_product 1 ORDER BY last_update DESC LIMIT?,?;
getProducts (0,5) 0 .
, SQL , 0 5. .
- , ?
Update
, , :
function dbDebugTest() {
global $db;
$stmt = $db->query("SELECT COUNT(*) AS count FROM tbl_product WHERE 1 ORDER BY last_update LIMIT 0,5;");
$result = $stmt->fetch();
$rows = (int)$result["count"];
logErrors("dbDebugTest() returned rows=".$rows);
}
:
> dbDebugTest() returned rows=12
, != null ! == null, $data:
logErrors("Data: ".implode(",",$data));
if ($data !== null) $query->execute($data); else $query->execute();
:
> Data: 0,5
dbRowsCount ($ sql, $data) - 0 !
2
PDOStatement, , , $query → ($ data), , .
:
function dbRowsCount($sql, $data) {
global $db, $query;
$regex = '/^SELECT\s+(?:ALL\s+|DISTINCT\s+)?(?:.*?)\s+FROM\s+(.*)$/is';
if (preg_match($regex, $sql, $output) > 0) {
$query = $db->prepare("SELECT COUNT(*) AS count FROM {$output[1]}");
logErrors("Regex output: "."SELECT COUNT(*) AS count FROM {$output[1]}");
$query->setFetchMode(PDO::FETCH_ASSOC);
logErrors("Data: ".implode(",",$data));
$query->execute($data);
logErrors("queryString:".$query->queryString);
logErrors("_debugQuery():".$query->_debugQuery());
if (!$query) {
echo "Oops! There was an error: PDOStatement returned false.";
exit;
}
$result = $query->fetch();
return (int)$result["count"];
} else {
logErrors("Regex did not match: ".$sql);
}
return -1;
}
:
: SELECT COUNT() AS count FROM tbl_product_category WHERE id =?;
: 5
queryString: SELECT COUNT() AS count FROM tbl_product_category WHERE id =?;
_debugQuery(): SELECT COUNT (*) AS count FROM tbl_product_category WHERE id =?;
: SELECT COUNT (*) AS count FROM tbl_product 1 ORDER BY last_update DESC LIMIT?,?;
: 0,5
// _debugQuery
3
PDOStatement, , , getProducts(...), params .
function getProducts($offset, $display) {
$sql = "SELECT * FROM tbl_product WHERE 1 ORDER BY last_update DESC LIMIT :offset, :display;";
$data = array(':offset'=>$offset, ':display'=>$display);
$rows = dbRowsCount($sql, $data);
logErrors("getProducts(".$offset.",".$display.") returned ".$rows." rows.");
if ($rows > 0) {
dbQuery($sql, $data);
return dbFetchAll();
} else {
return null;
}
}
:
: SELECT COUNT (*) AS count FROM tbl_product 1 ORDER BY last_update DESC LIMIT: offset,: display;
: 0,5
// $query- > execute ($ data) logErrors("getProducts(".$offset."...))
4
dbDebugTest 0,5 SQL. , :
function dbDebugTest($offset, $display) {
logErrors("Beginning dbDebugTest()");
global $db;
$stmt = $db->prepare("SELECT COUNT(*) AS count FROM tbl_product WHERE 1 ORDER BY last_update LIMIT :offset,:display;");
$stmt->bindParam(':offset', $offset, PDO::PARAM_INT);
$stmt->bindParam(':display', $display, PDO::PARAM_INT);
if ($stmt->execute()) {
$result = $stmt->fetch();
$rows = (int)$result["count"];
logErrors("dbDebugTest() returned rows=".$rows);
} else {
logErrors("dbDebugTest() failed!");
}
}
, :
dbDebugTest()
5
( ), :
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
dbDebugTest() Update 4!
dbDebugTest() dbDebugTest() = 12
- :
[warn] mod_fcgid: stderr: PHP :
"PDOException" "SQLSTATE [42000]:
: 1064 SQL.
, MySQL,
'' 0 ',' 5 '' 1 '
/home/linweb09/b/example.com-1050548206/user/my_program/database/dal.php:36
36 dbRowsCount(...), $query->execute($data).
getProducts(...) - , , params '' 0 '' 5 '' ( ?). , dal.php, - bindParam.
, @Travesty3 @eggyal ! .