学习PHP PDO。。想知道在涉及许多查询时使用它的正确方法吗

学习PHP PDO。。想知道在涉及许多查询时使用它的正确方法吗,php,mysql,oop,pdo,Php,Mysql,Oop,Pdo,在过去,我只是创建一个类来连接数据库,然后运行一系列方法来运行查询。。像这样: class connectDB { public $db_host = "asdf.db.asdf.hostedresource.com"; public $db_name = "asdf"; public $db_user = "asdf"; public $db_pass = "asdf!1"; public $result; function setDB_Host($value){ $this->db

在过去,我只是创建一个类来连接数据库,然后运行一系列方法来运行查询。。像这样:

class connectDB
{
public $db_host = "asdf.db.asdf.hostedresource.com";
public $db_name = "asdf";
public $db_user = "asdf";
public $db_pass = "asdf!1";
public $result;

function setDB_Host($value){
 $this->db_host=$value;
}

function setDB_name($value){
 $this->db_name=$value;
}

 function setDB_user($value){
 $this->db_user=$value;
}

function setDB_pass($value){
 $this->db_pass=$value;
}

function makeConnection()
{
    $connection = mysql_connect($this->db_host, $this->db_user, $this->db_pass) or die
    ("Unable to connect!");
    mysql_select_db($this->db_name) or die(mysql_error());
}

function setQuery($query)
{
    $this->result = mysql_query($query) or die(mysql_error());
}


    class video
    {
       public $sequence;
       public $fileName;
       public $vidTitle;
       public $vidCat;
       public $thumbName;


function addVideo($sequence, $fileName, $vidTitle, $vidCat, $thumbName)
{
    $this->connect-> setQuery("SELECT COUNT(id) AS numrows FROM vids WHERE vidCat = '$vidCat'");
    $row = mysql_fetch_array($this->connect->result);
    $sequence = $row['numrows'] + 1;
    $this->connect->setQuery("INSERT INTO vids (sequence, fileName, vidTitle, vidCat, thumbName) VALUES ('$sequence', '$fileName', '$vidTitle', '$vidCat', '$thumbName') ");

}

    function addKeypoints($keypoints, $mins, $secs)
{
        $v_id = mysql_insert_id();

    for ($i=0; $i<sizeof($keypoints); $i++)
    {       
        $totalsecs = ($mins[$i]*60) + $secs[$i];
        $this->connect->setQuery("INSERT INTO keypoints (v_id, totalsecs, keypoints, mins, secs) VALUES ('$v_id', '$totalsecs', '$keypoints[$i]', '$mins[$i]', '$secs[$i]') ");
    }

}
类连接数据库
{
public$db_host=“asdf.db.asdf.hostedresource.com”;
public$db_name=“asdf”;
public$db_user=“asdf”;
公共$db_pass=“asdf!1”;
公开结果;
函数setDB_主机($value){
$this->db_host=$value;
}
函数setDB_name($value){
$this->db_name=$value;
}
函数setDB_user($value){
$this->db_user=$value;
}
函数setDB_pass($value){
$this->db_pass=$value;
}
函数makeConnection()
{
$connection=mysql\u connect($this->db\u host,$this->db\u user,$this->db\u pass)或die
(“无法连接!”);
mysql_选择_db($this->db_name)或die(mysql_error());
}
函数setQuery($query)
{
$this->result=mysql\u query($query)或die(mysql\u error());
}
课堂录像
{
公共序列;
public$fileName;
公有产权;
公营部门$vidCat;
公共名称;
函数addVideo($sequence、$fileName、$vidTitle、$vidCat、$thumbName)
{
$this->connect->setQuery(“从vids中选择计数(id)作为numrows,其中vidCat='$vidCat'”);
$row=mysql\u fetch\u数组($this->connect->result);
$sequence=$row['numrows']+1;
$this->connect->setQuery(“插入到vids(序列、文件名、vidTitle、vidCat、thumbName)值(“$sequence”、“$fileName”、“vidTitle”、“vidCat”、“thumbName”)”);
}
函数addKeypoints($keypoints、$mins、$secs)
{
$v_id=mysql_insert_id();
对于($i=0;$iconnect->setQuery(“插入关键点(v_id,totalsecs,keypoints,min,secs)”值(“$v_id”,“$totalsecs”,“$keypoints[$i]”,“$min[$i]”,“$secs[$i]”);
}
}
我不想读这些。基本上我只是运行了一堆方法来访问我的第一个类,并运行查询。我不明白这在PDO上下文中是如何工作的。PDO应该使这类事情变得更容易,因为它是基于OOP的。对吗

    $hostname = "aaa.db.7149468.aaa.com";
    $username = "coolcaaaaodez";
    $password = "aaaa";

    try
    {
$dbh = new PDO("mysql:host=$hostname;dbname=coolcodez", $username, $password);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$stmt = $dbh->prepare("INSERT INTO links (link, cool, difficulty) values (:link, :cool, :difficulty)");

$stmt->bindParam(':link',       $_POST['link']);
$stmt->bindParam(':cool',       $_POST['cool']);
$stmt->bindParam(':difficulty', $_POST['difficulty']);

if(isset($_POST['submit-links']))
{
    $stmt->execute();
    echo "row added <br />";
}
    }
   catch(PDOException $e)
   {
        echo $e->getMessage();
   }
$hostname=“aaa.db.7149468.aaa.com”;
$username=“coolcaaaodez”;
$password=“aaaa”;
尝试
{
$dbh=newpdo(“mysql:host=$hostname;dbname=coolcodez”,$username,$password);
$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_异常);
$stmt=$dbh->prepare(“插入链接(链接,酷,难度)值(:链接,:酷,:难度)”);
$stmt->bindParam(':link',$\u POST['link']);
$stmt->bindParam(':cool',$\u POST['cool']);
$stmt->bindParam(‘:难度’,$_POST[‘难度’);
如果(isset($_POST['submit-links']))
{
$stmt->execute();
回显“添加行
”; } } 捕获(PDO$e) { echo$e->getMessage(); }

基本上,我要问的是..try/catch这件事真的让我大吃一惊。是否只需要将连接本身放入try/catch块中,然后我就可以在属于某个类的每个方法中准备查询?或者是每个事件序列(数据库连接、查询、结果等)需要被困在try/catch块中。PDO对我的需求来说有点花哨,但我正在努力学习,我想知道当涉及大量查询时编写它的最佳通用方法。

这样想-对于PDO可能遇到的任何错误,它都会抛出异常。当使用
mysql\ucode>函数时在ON上,它们要么返回
FALSE/NULL
,要么给你一个通知、警告甚至致命错误。使用PDO,你不会得到错误,你会得到异常。因此,你可以捕获
mysql\uu
会导致脚本全部停止的内容

因此,最后,您可能希望在每个可能导致某种错误的调用周围都有一个try/catch块,并且您知道如何处理它。如果这干扰了您的眼睛,您可以编写一个扩展PDO的短类,在其中执行try/catch逻辑,并返回结果或
FALSE/NULL
,就像
mysql\uuux一样e> 函数可以

PDO应该使这类事情变得更容易,因为它是基于OOP的。对吗

    $hostname = "aaa.db.7149468.aaa.com";
    $username = "coolcaaaaodez";
    $password = "aaaa";

    try
    {
$dbh = new PDO("mysql:host=$hostname;dbname=coolcodez", $username, $password);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$stmt = $dbh->prepare("INSERT INTO links (link, cool, difficulty) values (:link, :cool, :difficulty)");

$stmt->bindParam(':link',       $_POST['link']);
$stmt->bindParam(':cool',       $_POST['cool']);
$stmt->bindParam(':difficulty', $_POST['difficulty']);

if(isset($_POST['submit-links']))
{
    $stmt->execute();
    echo "row added <br />";
}
    }
   catch(PDOException $e)
   {
        echo $e->getMessage();
   }
是的,在某种程度上。 作为一个优秀的工具,OOP需要一些使用技巧——只有这样它才能让事情变得更容易。否则,它会让事情变得更难

实际上,您需要的所有代码都是

if(isset($_POST['submit-links']))
{
    require 'pdo.php';
    $sql  = "INSERT INTO links (link, cool, difficulty) values (?, ?, ?)";
    $data = array($_POST['link'], $_POST['cool'], $_POST['difficulty']);
    $dbh->prepare($sql)->execute($data);
}
代码的其余部分是多余的,原因有两个:

  • 当然,DB连接代码应该存储在一个单独的文件中,并包含在所有其他文件中,而不是每次都重复
  • 这个try-catch的东西确实让很多没有经验的开发人员感到困惑。事实上,这里根本不需要它——或者至少在这种形式下不需要它。这只是因为PHP可以自己处理错误(老实说,它比普通PHP用户做得更好)。因此,您可以省略这个try/catch的东西。进一步阅读:

  • 我有点理解……但是你介意写一些伪代码示例,这样我就可以更好地理解你的意思吗?