php pdo准备语句动态过滤器
我想使用pdo语句的简单过滤器。以前我使用的是下面的代码php pdo准备语句动态过滤器,php,mysql,pdo,Php,Mysql,Pdo,我想使用pdo语句的简单过滤器。以前我使用的是下面的代码 $sql = "select * from cities where 1 "; $city = $_REQUEST['city_name']; if($city!=""){ $sql = $sql. " and name ='".$city."'"; } $country = $_REQUEST['country_name']; if($country!=""){ $sql = $sql. " and country_
$sql = "select * from cities where 1 ";
$city = $_REQUEST['city_name'];
if($city!=""){
$sql = $sql. " and name ='".$city."'";
}
$country = $_REQUEST['country_name'];
if($country!=""){
$sql = $sql. " and country_name ='".$country."'";
}
$result= mysql_query($sql);
我想使用过滤器,如果名称或国家名称没有出现,它应该显示所有的结果,如果名称被选中,只有城市名称的结果将出现。如果选择了country,则将应用country,否则将不应用country筛选器 现在我想在pdo准备语句中使用相同的语句,但我不知道如何创建它
$db = new PDO('mysql:host=localhost;dbname=testdb;charset=utf8', 'username', 'password');
试试这个:(专门为您编辑)…现在所有绑定都在一个长if/elseif语句中完成。更多的代码,但可能快一点
$name = $_REQUEST['city_name'];
$country_name = $_REQUEST['country_name'];
$dsn = 'mysql:host=localhost;dbname=your_db';
$db_user = 'username';
$db_password = 'password';
$db = new PDO($dsn, $db_user, $db_password);
if ($name && $country_name) {
$query = 'SELECT * FROM cities WHERE name = :name AND country_name = :country_name';
$statement = $db->prepare($query);
$statement->bindValue(':name',$name);
$statement->bindValue(':country_name',$country_name);
} elseif ($name) {
$query = 'SELECT * FROM cities WHERE name = :name';
$statement = $db->prepare($query);
$statement->bindValue(':name',$name);
} elseif ($country_name) {
$query = 'SELECT * FROM cities WHERE country_name = :country_name';
$statement = $db->prepare($query);
$statement->bindValue(':country_name',$country_name);
} else {
$query = 'SELECT * FROM cities';
$statement = $db->prepare($query);
}
$statement->execute();
$statement->closeCursor();
您可以用同样的方法进行查询。但是要执行您使用的查询
$db = new PDO(your information...);
$stmt = $db->prepare($sql);<--your query is $sql
$stmt->execute();
$results = $stmt->fetchAll(PDO::FETCH_ASSOC); //use this to get associative array
$results = $stmt->fetchAll(PDO::FETCH_OBJ); //use this to get objects
$results = $stmt->fetchAll(PDO::FETCH_NUM); //use this for a regular array
$db=新PDO(您的信息…);
$stmt=$db->prepare($sql);执行();
$results=$stmt->fetchAll(PDO::FETCH_ASSOC)//使用此选项可以获得关联数组
$results=$stmt->fetchAll(PDO::FETCH_OBJ)//使用此选项获取对象
$results=$stmt->fetchAll(PDO::FETCH_NUM)//将其用于常规数组
有关获取样式的详细信息。您可能还想了解有关参数化查询的信息可以这样尝试:
$arr = array();
$sql = "select * from cities where 1 ";
$city = $_REQUEST['city_name'];
if($city!=""){
$sql .= " and name = :name";
$arr[] = ":name => $city";
}
$country = $_REQUEST['country_name'];
if($country!=""){
$sql .= " and country_name = :country";
$arr[] = ":country => $country";
}
$db = new PDO(DSN, user, password);//set correct db credential
$objStaement = $db->prepare($sql);
//if ($city) $objStaement->bindValue(':name',$city);
//if ($country) $objStaement->bindValue(':country',$country);
$objStaement->execute($arr);
$objStaement->closeCursor();
试试这个
$dynamic_fields
必须在键中包含mysql字段名,在值中包含输入名:
// mysql_fileld_name => request_key_name
$dynamic_fields = array(
'name' => 'city_name',
'country_name' => 'country_name'
);
$field_values = array();
foreach ($dynamic_fields as $mysql_fname => $input_fname) {
if (!empty($_REQUEST[ $input_fname ])) {
$sql .= ' AND `' . $mysql_fname . '` = :' . $mysql_fname;
$field_values[ ':' . $mysql_fname ] = $_REQUEST[ $input_fname ];
}
}
$pdo = new PDO('mysql:host=localhost;dbname=testdb;charset=utf8', 'username', 'password');
$statement = $pdo->prepare($sql);
$statement->execute($field_values);
$result = $statement->fetchAll();
为什么要使用
where 1
?@meagar我想根据条件使用筛选器,所以不想检查每次where子句,如果有人使用国家名称进行筛选器,则将应用国家筛选器如果没有城市名称和国家名称,则将显示所有结果?@nitinjain如果没有匹配项,不会获取任何结果。这不是你想要的吗?我想使用过滤器,如果名称或国家名称没有出现,它应该显示所有的结果,如果名称被选中,只有城市名称的结果将出现。如果选择了country,则country将应用,否则country筛选器将不应用。@nitinjain Ok检查我的编辑,看看它是否是您要查找的内容。@nitinjain elseifs确保在找到匹配项时不会计算其余参数。仅仅因为代码中有更多的文本并不意味着它将需要更长的时间来执行。是的,它似乎可以工作,但我必须编写两次if语句,第一次用于创建查询,第二次用于绑定。。使用1 if是否可能?@nitin jain:两次if语句是否有任何问题?但对于相同的条件,我正在编写2 if语句。如果我有很多过滤器,那么我必须编写过滤器*2 If块。可能会很慢?@nitin jain:你能试一下编辑后的答案并告诉我吗?应该是$arr[“:name”]=$city代码>和$arr[“:country”]=$country代码>