我正在从基于mySQL的php迁移到PDO。我正在做一个if声明。基本上,我想从数据库中查询一个值,并检查是否有任何返回。
使用mySQL,我会这样做:
//Query the entered data to see if it matches
$myQuery = "SELECT * FROM $tbl_name WHERE myData ='$MyData'";
$myResult = mysql_query($myQuery);
// If statement
if( mysql_num_rows($myResult) >=1 ) {
$result .= "The data matched and SQL query was successful";
}
到目前为止,我已经有了这个,虽然它还没有工作:
//Query the entered data to see if it matches
$myQuery = "SELECT myData FROM table_name WHERE myData = '$myData'";
$myResult = $db->single($myQuery);
// If statement
if($myResult == 1) {
$result .= "The data matched and PDO query was successful";
}
虽然从我看到的你不需要将查询和结果与PDO分开,并且可以将查询和结果合并到一个语句中。
答案 0 :(得分:1)
$myQuery = $db->prepare("SELECT myData FROM table_name WHERE myData = ?");
$myQuery->execute(array($myData));
$myResult->rowCount($myQuery);
// If statement
if($myResult == 1) {
$result .= "The data matched and SQL query was successful";
}
答案 1 :(得分:1)
在PDO中你会这样做:
$data_exists = $dbh->prepare('SELECT 1
FROM `table_name`
WHERE `myData` = ?');
$data_exists->execute(array($myData));
if ($data_exists->rowCount() == 1) {
$result .= 'The data matched and PDO query was successful';
}
答案 2 :(得分:1)
要回答您的问题,您可以使用PDO的函数rowCount()。
if ($myResult->rowCount() > 0) {
$result .= 'The data matched and PDO query was successful';
}
但请注意您的PDO查询不安全。由于您直接在查询中插入变量,因此它仍然容易受到MySQL注入攻击。请改用PDO的函数bindParam()或bindValue()。
答案 3 :(得分:1)
虽然从我看到的你不需要将查询和结果与PDO分开,并且可以将查询和结果合并到一个语句中。
它确实允许你不应该使用PDO的方式。但是,你的单个函数不是PDO,我怀疑它会允许你任何num行。但是你无论如何都不需要这个号码。
所以,要把事情做好直接
这就是
public function single($myQuery, $params = NULL, $style = PDO::FETCH_ASSOC)
{
$stmt = $this->pdo->prepare($myQuery);
$stmt->execute($params);
return $stmt->fetch($style);
}
$myQuery = "SELECT myData FROM table_name WHERE myData = ?";
$myResult = $db->single($myQuery, [$myData]);
if($myResult) {
$result .= "The data matched and PDO query was successful";
}
如果您不需要结果本身,那么您可以缩短一点
$myQuery = "SELECT 1 FROM table_name WHERE myData = ?";
if($db->single($myQuery, [$myData])) {
$result .= "The data matched and PDO query was successful";
}
答案 4 :(得分:0)
确定。谢谢大家的答案。在考虑并进行一些测试之后,我想与您分享一些调查结果。
关于手头的问题,即在用PDO检查数据库值时设置if语句,我注意到了一些差异。对于你们中的一些人来说这可能是显而易见的,但对于那些来自mysql的人(像我一样),它不是。
经过一些测试后,我发现我无法像使用mysql那样用PDO查询字符串。此外,在mysql中,您可以在数据库中查询之前设置字符串值。
从我所看到的,PDO只会查询并返回数组。所以你不能简单地插入一个字符串值并检查它。
关于我的问题,我发现使用它:
我的查询PDO语法不正确。
当它正确时,我只能查询返回数组的数组。
无论如何这就是我所做的:
// Get's the entire column called "ColumnName"
$getColumn = $db->column("SELECT columName FROM table_name ");
// Check if the returned array contains a string.
$myString = "matchThisString";
if (in_array($myString, $getColumn)) {
echo "A Match was found";
}
else {
echo "No match was found";
}
我建议您阅读以下内容:
http://www.php.net/manual/en/pdostatement.fetch.php
答案 5 :(得分:-1)
所有建议使用rowCount()
的答案都是错误的,rowCount()
仅在影响行而不是选定行的操作中返回非零值,或者至少在PHP manual: PDO::Statement {&#}}中#{}返回非零值39;不保证。
PDOStatement :: rowCount()返回行数 受到影响 最后一个DELETE,INSERT或UPDATE语句由相应的执行 PDOStatement对象。 如果关联的PDOStatement执行的最后一个SQL语句是SELECT 声明,某些数据库可能会返回该语句返回的行数。 但是,并不保证所有数据库都存在此行为,因此不应该这样做 依赖于便携式应用程序。
手册中的更多文字
示例#2计算SELECT语句返回的行
对于大多数数据库,PDOStatement :: rowCount()不返回 受SELECT语句影响的行数。相反,使用 PDO :: query()发出带有相同的SELECT COUNT(*)语句 将谓词作为预期的SELECT语句,然后使用 PDOStatement :: fetchColumn()来检索那些行数 将被退回。然后您的应用程序可以正确执行 动作。
至少我知道我遇到了很多问题。
另一种方法是使用:
$rows = stmt->fetchAll(PDO::FETCH_ASSOC);
if (count($rows))
{
//Do something here
}
else
{
//Do something else here.
}
如果您希望返回小数据集,则上面的代码块很好。如果我们正在讨论大量数据集,那么您最好执行2个查询,其中一个查询COUNT
,其条件与您的select语句相同,然后是SELECT
声明如下:
$sql = "SELECT COUNT(*) FROM $tbl_name WHERE myData ='$MyData";
$count = $db->query($sql)->fetch();
if ($count[0] > 0)
{
$myQuery = "SELECT * FROM $tbl_name WHERE myData ='$MyData'";
//.... Continue your code here since now you know for sure that your
//query will return rows....
//.....
}
else
{
//handle the case that no data were returned.
}
上面的代码块仅用于演示,因此您可以了解该怎么做以及如何做。 我不能保证这是最好的方式,它就是我这样做的方式。欢呼声。
另一种更好的方法是使用准备好的语句作为某人或某些建议。这与你在这里处理你的问题的方式无关,它只是一种更安全的做法,因为准备好的语句会阻止SQL Injection
,如果不是那么完全可以达到很好的程度(不确定)。
答案 6 :(得分:-1)
您可以这样做:
$sql = "SELECT * FROM animals";
$stmt = $dbh->query($sql);
$result_count = $stmt->fetch(PDO::FETCH_ASSOC);
if($result_count == 1)
{
$result .= "The data matched and PDO query was successful";
}