我有以下功能:
public function search_exists($word){
$word=trim($word);
$query="SELECT * FROM `search` WHERE `word`=$word";
echo $query;
$st=$this->pdo->query($query);
if($st->fetch()){
return true;
}
return false;
}
我想检查一下行是否存在..问题是我是pdo的新手。它返回false ..当我知道有一行..hmm
更新:
关于sql_injection:
我用这个:
$word=$pdo->quote($_GET['search']);
我想从这样的查询中撤回数据:
public function search_exists($word){
$word=trim($word);
$query="SELECT search_id FROM `search` WHERE `word`=$word";
echo $query;
$st=$this->pdo->query($query);
while($row=$st->fetch()){
return $row['search_id'];
}
return false;
}
问题..甚至上面的查询也无效
答案 0 :(得分:1)
如果word
是字符串类型,您可以尝试用引号括起来:
$query="SELECT search_id FROM `search` WHERE `word` = '$word'";
如上所述,您应该binding the parameters,然后您就不会遇到此问题,因为它会在必要时为您添加引号。它可以更好地保护你免受Sql注入。
从manual,而不是调用fetch()
,尝试重复$st
:
foreach($st as $row) {
echo $row['search_id'];
}
答案 1 :(得分:1)
首先:使用prepared语句绑定参数:
public function search_exists($word){
$word=trim($word);
$query="SELECT * FROM `search` WHERE `word`=:word";
echo $query;
$st=$this->pdo->prepare($query);
$st->bindValue('word',$word);
$st->execute();
if($st->fetch()){
return true;
}
return false;
}
现在你的查询引用没有问题,并且没有sql注入的可能性。
然后,另一种可能性是使用count语句,它是严格等价的
public function search_exists($word){
$word=trim($word);
$query="SELECT COUNT(*) FROM `search` WHERE `word`=:word";
echo $query;
$st=$this->pdo->prepare($query);
return $st->fetchColumn() > 0;
}
如果您想获取数据:
public function search_exists($word){
$word=trim($word);
$query="SELECT * FROM `search` WHERE `word`=:word";
echo $query;
$st=$this->pdo->prepare($query);
$st->bindValue('word',$word);
$st->execute();
$result = $st->fetch(PDO::FETCH_ASSOC);
if(isset($result['id_result'])){
return result['id_result'];
}
return false;
}
答案 2 :(得分:1)
试试这个
public function search_exists($word){
$word=trim($word);
$query="SELECT COUNT(*) FROM `search` WHERE `word`=$word";
echo $query;
$st=$this->pdo->query($query);
if($st->fetchColumn()>0){
return true;
}
return false;
}