嘿伙计们我在这里运行这个小功能
function getBeaches() {
$request=Slim::getInstance()->request();
$args=filter_var_array(func_get_args(),FILTER_SANITIZE_STRING);
$sql="SELECT * FROM beaches WHERE state=:state AND city=:city";
// var_export($args); die();
// array ( 0 => 'wa', 1 => 'seattle', )
try {
$db = getConnection();
$stmt = $db->prepare($sql);
$stmt->bindValue('state', $args[0], PDO::PARAM_STR); //should bind wa
$stmt->bindValue('city', $args[1], PDO::PARAM_STR); //should bind seattle
$stmt->execute();
$stmt = $db->query($sql);
$beaches = $stmt->fetchObject();
$db = null;
echo '{"map": ' . stripslashes(json_encode($beaches)) . '}';
} catch(PDOException $e) {
echo '{"error":{"text":'. $e->getMessage() .'}}';
}
/* {"error":{"text":SQLSTATE[42000]: Syntax error or access violation:
* 1064 You have an error in your SQL syntax; check the manual that
* corresponds to your MySQL server version for the right syntax to use
* near ':state AND city=:city' at line 1}}
*/
}
我收到了我在底部评论的错误,试图像这样运行
mysql$ SELECT * FROM beaches WHERE state='wa' AND city='seattle';
可能会发出一些响声吗?
答案 0 :(得分:3)
你的param名称前需要分号:(不是100%为真,见编辑)
$stmt->bindValue(':state', $args[0], PDO::PARAM_STR); //should bind wa
$stmt->bindValue(':city', $args[1], PDO::PARAM_STR); //should bind seattle
来自PDOStatement::bindValue()上的PHP文档:
参数标识符。对于使用命名占位符的预准备语句,这将是:name 形式的参数名称。对于使用问号占位符的预准备语句,这将是参数的1索引位置。
修改强>
由于 @jeroen 已指出问题(在您的pastebin中是同一个问题),因此在从其获取数据之前覆盖$stmt
变量。在您的代码中,问题出在第17行:
$stmt->execute(); // $stmt now has query results (from the query with parameters bounded)
$stmt = $db->query($sql); // You redo the query. Now $stmt has no query results and no parameters are bound
$beaches = $stmt->fetchObject(); // Statement assumes you want to execute query and does so but not parameters are bound
您可以通过将以上行更改为:
来解决此问题$stmt->execute();
$beaches = $stmt->fetchObject();
答案 1 :(得分:0)
不确定是否有帮助,但我总是使用bindParam
而不是bindValue
。如果您选择这样做,请修改您的活页夹:
$stmt->bindParam(':state', $args[0], PDO::PARAM_STR);
$stmt->bindParam(':city', $args[1], PDO::PARAM_STR);
除此之外,你所做的一切对我来说都很好。