如何在 PDO 查询中将参数添加到子句

How to add parameter to clause in PDO query

我正在使用代码 运行 一个 Mysql 查询,该查询定义了一个子句 ($datimeClause)。我想 运行 带有第二个参数 (:method) 的查询,但是如果我完全更改子句的语法,查询将不会 运行。我是 PDO 的新手,有人可以告诉我如何重新格式化子句以查询第二个参数。

这是查询

public static function getList( $numRows=1000000, $datimeId=null ) {
    $conn = new PDO( DB_DSN, DB_USERNAME, DB_PASSWORD );
    $datimeClause = $datimeId ? "WHERE DatimeId = :datimeId" : "";
    $sql = "SELECT SQL_CALC_FOUND_ROWS * FROM notify $datimeClause";
    $st = $conn->prepare( $sql );
    $st->bindValue( ":numRows", $numRows, PDO::PARAM_INT );
    $st->bindValue( ":datimeId", $datimeId, PDO::PARAM_INT );
    $st->execute();
    $list = array();
    while ( $row = $st->fetch() ) {
      $text = new Text( $row );
      $list[] = $text;
    }

这是调用它的函数。

function newAutoText() {
    $results = array();
    $datimeId = ( isset( $_GET['datimeId'] ) && $_GET['datimeId'] ) ? (int)$_GET['datimeId'] : null;
    $results['datime'] = Text::getById( $datimeId );
    $data = Text::getList( 100000, $results['datime'] ? $results['datime']->id : null);
    $results['texts'] = $data['results'];
    $results['totalRows'] = $data['totalRows']; 


    require( TEMPLATE_PATH . "/sms.php" );
}

所以试试吧:

public static function getList( $numRows=1000000, $datimeId=null, $andClause=null ) {

这里: $data = Text::getList( 100000, $results['datime'] ? $results['datime']->id : null, 'testMethod');

这里偏离路线:

$sql = "SELECT SQL_CALC_FOUND_ROWS * FROM notify $datimeClause";
if ($andClause!=null ) $sql .= " AND method= :method ";
    $st = $conn->prepare( $sql );
    $st->bindValue( ":numRows", $numRows, PDO::PARAM_INT );
    $st->bindValue( ":datimeId", $datimeId, PDO::PARAM_INT );
if ($andClause!=null ) 
    $st->bindValue( ":method", $andClause, PDO::PARAM_STR );

好的,我 运行 在调用函数中的第一个 getById 查询是任意的。

这个有效:

public static function getList( $numRows=1000000, $datimeId, $method=1 ) {
    $conn = new PDO( DB_DSN, DB_USERNAME, DB_PASSWORD );
    $datimeClause = $datimeId ? "WHERE DatimeId = :datimeId" : "";
    $sql = "SELECT SQL_CALC_FOUND_ROWS * FROM notify $datimeClause AND Method= :method LIMIT :numRows";
    $st = $conn->prepare( $sql );
    $st->bindValue( ":numRows", $numRows, PDO::PARAM_INT );
    $st->bindValue( ":datimeId", $datimeId, PDO::PARAM_INT );
    $st->bindValue( ":method", $method, PDO::PARAM_INT );
    $st->execute();
    $list = array();

    while ( $row = $st->fetch() ) {
      $text = new Text( $row );
      $list[] = $text;
    }

    // Now get the total number of articles that matched the criteria
    $sql = "SELECT FOUND_ROWS() AS totalRows";
    $totalRows = $conn->query( $sql )->fetch();
    $conn = null;
    return ( array ( "results" => $list, "totalRows" => $totalRows[0] ) );
  }

function newAutoText() {
    $results = array();
    $datimeId = ( isset( $_GET['datimeId'] ) && $_GET['datimeId'] ) ? (int)$_GET['datimeId'] : null;
    $data = Text::getList( 100000, $datimeId, '1');
    $results['texts'] = $data['results'];
    $results['totalRows'] = $data['totalRows']; 


    require( TEMPLATE_PATH . "/sms.php" );
}