【问题标题】:Unable to paginate: Invalid total value (must be an integer > 0) In Php PDO无法分页:Php PDO 中的总值无效(必须是整数 > 0)
【发布时间】:2015-07-26 05:45:57
【问题描述】:

我正在处理一个查询几天并坚持成功执行它。我正在使用位于此处的分页类 Pagination.class

到目前为止,这是我的代码。问题是它一直显示错误

if(isset($_REQUEST['maker'])){$makes = $_REQUEST['maker']; }
if(isset($_REQUEST['transmission'])){ $trans = $_REQUEST['transmission']; } 
if(isset($_REQUEST['year_from'])){ $yearf = $_REQUEST['year_from']; } 
if(isset($_REQUEST['year_to'])){ $yeart = $_REQUEST['year_to']; } 
if(isset($_REQUEST['fuel'])){ $fuels = $_REQUEST['fuel']; } 


if($makes == NULL || NULL == $makes)
{
$makes='%';
 }


 if($trans == NULL || NULL == $trans)
{
 $trans='%';
 }


if($fuels == NULL || NULL == $fuels)
{
$fuels='%';
 }




 try{

$conn = new PDO('mysql:host=localhost;dbname=vc', 'root', '');
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

 $result = $conn->prepare('SELECT COUNT(*) FROM vehicle WHERE 
(`Make` LIKE :maker) AND(`Transmission` LIKE :transmission)  AND 
(YEAR(STR_TO_DATE(`Year`,"%Y")) BETWEEN (:year_from) AND (:year_to)) AND
 (`Fuel` LIKE :fuel)'); 

$result->bindParam(':maker', $makes, PDO::PARAM_STR);
$result->bindParam(':transmission', $trans, PDO::PARAM_STR);
 $result->bindParam(':year_from', $yearf,PDO::PARAM_STR);
$result->bindParam(':year_to', $yeart, PDO::PARAM_STR);
$result->bindParam(':fuel', $fuels, PDO::PARAM_STR);

$result->execute(); 
  $num_rows=$result->fetchColumn();  

$pages = new Paginator($num_rows,5,array(15,3,6,9,12,25,50,100,250,'All'));
//echo $pages->display_pages();

//echo "<span class=\"\">".$pages->display_jump_menu().$pages->display_items_per_page()."</span>";



  $stmt = $conn->prepare('SELECT * FROM vehicle WHERE 
(`Make` LIKE :maker) AND (`Transmission` LIKE :transmission)  AND  
(YEAR(STR_TO_DATE(`Year`,"%Y")) BETWEEN (:year_from) AND (:year_to)) 
AND (`Fuel` LIKE :fuel) ORDER BY Year DESC LIMIT :start,:end');

$stmt->bindParam(':start', $pages->limit_start, PDO::PARAM_INT);
$stmt->bindParam(':end', $pages->limit_end, PDO::PARAM_INT);
$stmt->bindParam(':maker', $makes, PDO::PARAM_STR);
$stmt->bindParam(':transmission', $trans, PDO::PARAM_STR);
$stmt->bindParam(':year_from', $yearf, PDO::PARAM_STR);
$stmt->bindParam(':year_to', $yeart, PDO::PARAM_STR);
$stmt->bindParam(':fuel', $fuels, PDO::PARAM_STR);



$stmt->execute();
 $rs = $stmt->fetchAll();

无法分页:总值无效(必须是大于 0 的整数)

当将年份字段留空时,它会给出错误。当插入 year_from 和 year_to 字段时,它的工作正常。任何人都可以帮忙吗?卡了5天

年度数据库字段为日期

问题出在子句之间

【问题讨论】:

    标签: mysql pdo pagination


    【解决方案1】:

    如果您将year_fromyear_to 参数留空,则$yearf$yeart 保持未定义并且以下代码

    $result->bindParam(':year_from', $yearf,PDO::PARAM_STR);
    $result->bindParam(':year_to', $yeart, PDO::PARAM_STR);
    

    将参数绑定到空字符串,从而产生这样的查询

    BETWEEN ('') AND ('')
    

    结果为空,$num_rows0,Pagination构造函数中验证失败。

    您应该在 php.ini 中使用 error_reporting=E_ALLdisplay_errors=On 进行开发,这会警告您未定义的变量。

    【讨论】:

    • 我知道,如果 year_from 和 year_to 字段为空,则会发生错误,我想知道如何解决此问题,如果这两个字段为空,如何显示所有记录
    • 我添加了这些行来检查字段是否为空,然后获取整行。但它不起作用 if($yearf == NULL || NULL == $yearf) { $yearf='%'; } if($yeart == NULL || NULL == $yeart) { $yeart='%'; }
    • 如果它们为空,您可以将它们设置为 0000-00-00 00:00:00 和 9999-12-31 23:59:59
    • 你在说这个 if($yearf == NULL || NULL == $yearf) { $yearf='0000-00-00'; } if($yeart == NULL || NULL == $yeart) { $yeart='0000-00-00'; }
    • 否,全年使用最大值。我也会使用 if(empty($yeart)) 作为条件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-12
    • 2015-12-31
    • 2019-11-02
    相关资源
    最近更新 更多