Impaginazione DOP con MI PIACE
Il seguente codice SQL PHP mostra un errore Errore irreversibile recuperabile: L'oggetto della classe PDOStatement non può essere convertito in una stringa in /home/customer/xxxx/fetch_data.php alla riga 28 Stavo cercando di visualizzare le informazioni sui prodotti dalla tabella filter
Ce ne sono due $statement->execute();
, uno è quello di contare i risultati totali della ricerca e un altro è quello di visualizzare i prodotti per la pagina corrente. Non conosco il metodo DOP e non sono esperto di codifica generale.
La sta causando problemi. Con quello e le funzioni correlate, il codice funziona e visualizza i dati. Ma se lo abilito, viene visualizzato l'errore.$filter_query = $stmt . 'LIMIT '.$start.', '.$limit.'';
$limit = '5';
$page = 1; if($_POST['page'] > 1)
{
$start = (($_POST['page'] - 1) * $limit); $page = $_POST['page']; } else { $start = 0;
}
$search = "%samsung%"; $stmt = $connect->prepare("SELECT * FROM filter WHERE product_name LIKE :needle"); $stmt->bindParam(':needle', $search, PDO::PARAM_STR); ## ## $filter_query = $stmt . 'LIMIT '.$start.', '.$limit.''; $statement->execute();
$total_data = $stmt->rowCount();
$stmt = $connect->prepare($filter_query); $stmt->execute();
$result = $stmt->fetchAll();
$total_filter_data = $stmt->rowCount();
$output = ' <h3> '.$total_data.' results found </h3>
and display each product
Ho provato il codice seguente come suggerito da Your Common Sense
e l'impaginazione e il conteggio totale dei risultati di ricerca funzionano correttamente, ma non viene visualizzato alcun prodotto.
$limit = '5'; $page = 1;
if($_POST['page'] > 1) { $start = (($_POST['page'] - 1) * $limit);
$page = $_POST['page'];
}
else
{
$start = 0; } $name=str_replace(' ', '%', $_POST['query']); $search = "%$name%"; $base_sql = "SELECT %s FROM filter WHERE product_name LIKE ?";
##
##
####
$count_sql = sprintf($base_sql, "count(*)");
$stmt = $connect->prepare($count_sql); $stmt->execute([$search]); $total_data = $stmt->fetchColumn(); #### $data_sql = $count_sql = sprintf($base_sql, "*")." LIMIT ?,?";
$stmt = $connect->prepare($data_sql); $stmt->execute([$search, $start, $limit]); $result = $stmt->fetchAll(); ## $output = '
<h3> '.$total_data.' results found </h3> '; if($total_data > 0)
{
foreach($result as $row)
{
and display each product
L'utilizzo della riga seguente fa sì che il codice mostri alcuni dati, ma l'impaginazione non funziona.
$data_sql = sprintf($base_sql, "*");
$stmt = $connect->prepare($data_sql); $stmt->execute([$search]); $result = $stmt->fetchAll();
Risposte
Non è un'attività banale in quanto dobbiamo eseguire la stessa query due volte ma con piccole differenze. La prima query utilizzerà la count(*)
funzione SQL per ottenere il numero totale di record corrispondenti ai criteri di ricerca. La seconda query selezionerà i campi effettivi con la clausola LIMIT per ottenere i dati per la singola pagina.
$base_sql = "SELECT %s FROM filter WHERE product_name LIKE ?"; $count_sql = sprintf($base_sql, "count(*)"); $stmt = $connect->prepare($count_sql);
$stmt->execute([$search]);
$total = $stmt->fetchColumn();
$data_sql = $count_sql = sprintf($base_sql, "*")." LIMIT ?,?"; $stmt = $connect->prepare($data_sql);
$stmt->execute([$search, $start, $limit]);
$data = $stmt->fetchAll();
Importante: affinché questo codice funzioni, assicurati di connetterti a mysql correttamente . la corretta connessione consentirà a una clausola LIMIT di accettare segnaposto e ti avviserà in caso di problemi.