PHP:从基于if语句的PDO返回值

时间:2014-04-29 09:01:42

标签: php mysql pdo

我正在从基于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分开,并且可以将查询和结果合并到一个语句中。

7 个答案:

答案 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行。但是你无论如何都不需要这个号码。

所以,要把事情做好直接

  1. 你的single()函数应该支持预准备语句。
  2. 拥有此功能的结果,您需要根本没有数字行
  3. 这就是

    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只会查询并返回数组。所以你不能简单地插入一个字符串值并检查它。

关于我的问题,我发现使用它:

  1. 我的查询PDO语法不正确。

  2. 当它正确时,我只能查询返回数组的数组。

  3. 无论如何这就是我所做的:

    // 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

    http://www.php.net/manual/en/language.types.boolean.php

    http://www.php.net/manual/en/language.types.array.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";
}