【问题标题】:How to write this code below in PDO如何在 PDO 中编写以下代码
【发布时间】:2012-06-10 01:19:44
【问题描述】:

我有一个旧的 mysql 代码,我想将它转换为 PHP 数据对象,但我在网上找不到如何做到这一点,有什么帮助吗?

    $num = mysql_num_rows($result = mysql_query($query));

while($row = mysql_fetch_array($result))
  {

...
}

$query 是一个 SELECT 语句。

更新:

我的代码只显示消息“找不到驱动程序”而没有其他信息,它没有显示表单代码或类似的东西。我在 PDO 中做错了什么?我知道数据库、主机名、用户名和密码都是正确的,所以它应该能够显示表单,然后让我连接到数据库。

<?php

session_start(); 

$hostname = 'localhost';
$username="xxx";
$password="xxx";
$database="mobile_app";

try {
    $dbh = new PDO("mysql:host=$hostname;dbname=$database", $username, $password);


?>

,,, //Form Code is in here

<?php
if (isset($_POST['submit'])) {

$query = "
SELECT * FROM Teacher t  
WHERE 
(t.TeacherUsername = '".mysql_real_escape_string($teacherusername)."')
AND
(t.TeacherPassword = '".mysql_real_escape_string($teacherpassword)."')
";

$loged = false;

foreach ($dbh->query($sql) as $row)
  {

,,,, //results for each row



  }

 $dbh = null;

}

    }
catch(PDOException $e)
    {
    echo $e->getMessage();
    }
 ?>

【问题讨论】:

    标签: php mysql pdo


    【解决方案1】:
    $result = $link->query($query); # Replace $link with your database handle
    $rows = $link->fetchAll(PDO::FETCH_BOTH);
    $num = count($rows);
    
    foreach($rows as $row) {
        # ...
    }
    

    …是直接等价的。当然,您可能不需要PDO::FETCH_BOTH(我推荐PDO::FETCH_OBJ 以获得更清洁的包中的相同功能),并且您可能希望利用参数化查询,在这种情况下您会调用prepare而不是query,然后绑定参数,然后调用execute()获取结果。

    您可能会发现the reference for PDOStatement 很有帮助。

    编辑:正如评论者指出的那样,rowCount() 并不是那么好,即使它是最直接的等价物。我已经用更好的东西更新了它。

    【讨论】:

    • 值得注意的是,在某些情况下PDOStatement::rowCount() 不会返回正确的值。在这种情况下,需要做SELECT COUNT(*)count(PDOStatement::fetchAll())。尽管如此,我有点怀疑 OP 是否需要这样做。
    • @KemalFadillah:哪些情况? (我希望你提到的情况不常见,否则我有很多修改要做!)
    • 所以你说应该是这样的:$result = $dbh-&gt;prepare($query); $num = $result-&gt;rowCount(); while($row = $result-&gt;fetch(PDO::FETCH_OBJ)) { # ... } $dbh is connection to db
    • @user1438647:你需要一个$result-&gt;execute();,但这就是想法。当然,如果查询没有参数,请务必使用query()
    • @minitech 别担心,它们并不常见。事实上,我从来没有遇到过这样的 PHP & MySQL 问题。但话又说回来,我总是使用这两个的最新版本。无论如何,这里有一些例子:php.net/manual/en/pdostatement.rowcount.php#88352 & php.net/manual/en/pdostatement.rowcount.php#80041。我认为在 cmets 中还有这两个,但我懒得去寻找其余的了。 :P
    【解决方案2】:
    try {
        $dbh = new PDO($dsn, $user, $password);
    } catch (PDOException $e) {
        echo 'Connection failed: ' . $e->getMessage();
    }
    
    // PDOStatement is traversable, so you could use foreach.
    foreach ($dbh->query($sql) as $row) {
      //...
    }
    

    【讨论】:

    • 您好,只需要问1个小问题,脚本底部的$dbh = null;是否相当于mysql_close()?
    • @user1438647:在脚本底部之前将任何内容设置为null 通常没有多大意义。你不需要做任何事情。
    • @user1438647 php脚本退出后会释放连接,一般不需要这样做。
    • @xdazz 我在连接到数据库时遇到问题,我认为在我的应用程序中它只是显示消息“找不到驱动程序”并且它没有显示任何其他内容。我在我的代码中做错了吗?我已经更新了问题供您查看
    • @user1438647 那是因为你没有安装pdo-mysql
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-02
    • 2015-08-05
    • 1970-01-01
    • 1970-01-01
    • 2019-08-19
    • 2021-05-07
    • 1970-01-01
    相关资源
    最近更新 更多