问题描述
PDO::prepare — 准备要执行的语句,带有变量(表名、以及参数变量);
使用 bindParam() 分别绑定前面提到的变量,execute 执行预处理语句返回 false。
代码部分:
$conn = new PDO($dsn, $user, $pass,array(PDO::ATTR_PERSISTENT=>true));
echo "connecting...<br/>";
$tableName = "20190101";
$period1 = 3;
$period2 = 5;
echo "tablename:$tableName, tB:$period1, tE:$period2<br/>";
$sqlSelect = "SELECT COUNT(*) FROM :tablename WHERE (periodBegin>= :t1 AND periodBegin<= :t2) OR (periodEnd >= :t1 AND periodEnd<= :t2)";
$stmt = $conn -> prepare ( $sqlSelect );
$stmt ->bindColumn(':tablename', $tableName, PDO::PARAM_STR); //这里的问题
$stmt ->bindColumn(':t1', $period1, PDO::PARAM_INT);
$stmt ->bindColumn(':t2', $period2, PDO::PARAM_INT);
$stmt ->execute();
$result = $stmt->fetch();
var_dump($result[0]);
错误原因:
bindParam() 不能绑定表名称。表名称需要使用字符串拼接的方式设定。
代码修改:
try {
$conn = new PDO($dsn, $user, $pass,array(PDO::ATTR_PERSISTENT=>true));
echo "connecting...<br/>";
$tableName = "20190101";
$period1 = 3;
$period2 = 5;
echo "tablename:$tableName, tB:$period1, tE:$period2<br/>";
$sqlSelect = 'SELECT COUNT(*) FROM `'.$tableName.'` WHERE (`periodBegin`>= :t1 AND `periodBegin`<= :t2) OR (`periodEnd` >= :t1 AND `periodEnd`<= :t2)';
$stmt = $conn -> prepare ( $sqlSelect );
$stmt ->bindParam(':t1', $period1, PDO::PARAM_INT);
$stmt ->bindParam(':t2', $period2, PDO::PARAM_INT);
$stmt ->execute();
$result = $stmt->fetch();
var_dump($result[0]);
} catch (PDOException $ex) {
die ("Error!: " . $ex->getMessage() . "<br/>");
}
谢谢浏览,有问题麻烦指出,谢谢。