特定MySQL选择查询到PDO选择查询

时间:2015-11-08 16:54:08

标签: php mysql pdo

我在mySQL中选择了这个查询。试图将其更改为PDO。这个问题并不完全重复,因为其他答案并不完全显示如何执行此操作。

$check_pic = mysql_query("SELECT profile_pic FROM users WHERE username='$username'");
      $get_pic_row = mysql_fetch_assoc($check_pic);
      $profile_pic_db = $get_pic_row['profile_pic'];
      if ($profile_pic_db == "") {
      $profile_pic = "img/default_pic.jpg";
      }
      else
      {
      $profile_pic = "userdata/pp/".$profile_pic_db;
      }

如果users表中的profile_pic字段中没有任何内容存储,那么变量$ profile_pic应该是默认图像,如果在users表的profile_pic中存储了一个位置,那么它应该是$ profile_pic =“userdata / PP /".$ profile_pic_db;

旁边问题:

最后,一个附带问题,我是否必须输入'try','catch'&每个插入查询的“新PDO”?像这样;

$server = "localhost";
$user = "username";
$pass = "password";
$dbn = "databasename";

try {
$db = new PDO("mysql:host=$server;dbname=$dbn", $user, $password);

// set the PDO error mode to exception
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

// prepare sql and bind parameters
$stmt = $db->prepare("INSERT INTO tablename (name)
VALUES (:name)");

$stmt->bindParam(':name', $name);

$name = $_POST['name'];

$stmt->execute();
}
catch(PDOException $e)
{
echo "Error: " . $e->getMessage();
}
$db = null;

1 个答案:

答案 0 :(得分:2)

每次都不必使用try / catch,只有当您想要检测到一些意外错误时,例如无效的SQL查询。连接中使用了try catch来捕获和操作错误,以防出现连接错误(用户名,密码,服务器未找到等)

例如,如果您在SQL查询中有错误,例如:

$stmt = $db->prepare("INVALID profile_pic FROM users WHERE username = :username");

这会引发一个你应该抓住的异常:

try {
    $stmt = $db->prepare("INVALID profile_pic FROM users WHERE username = :username LIMIT 1");
    $stmt->bindValue(':username', $username);
    $stmt->execute();

    $userData = $stmt->fetch(PDO::FETCH_ASSOC);
} catch(PDOException $e) {
    echo "Invalid SQL Query";
}

但是,如果您完全确定查询是正确的,那么您就不必使用它。

关于第一个问题:

<?php
$connectionData = [
    "server" => "localhost",
    "user" => "",
    "pass" => "",
    "database" => ""
];

$username = $_POST["username"];

$db = null;

try {
    $db = new PDO("mysql:host=" . $connectionData["server"] . ";dbname=" . $connectionData["database"], $connectionData["user"], $connectionData["pass"]);
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e) {
    echo $e->getMessage();
}


$stmt = $db->prepare("SELECT profile_pic FROM users WHERE username = :username LIMIT 1");
$stmt->bindValue(':username', $username);
$stmt->execute();

$userData = $stmt->fetch(PDO::FETCH_ASSOC);
$profilePic = "img/default_pic.jpg";


if($userData != false) {
    if(array_key_exists("profile_pic", $userData) && !empty($userData["profile_pic"])) {
        $profilePic = $userData["profile_pic"];
    }
}

if($db !== null) {
    $db = null;
}

?>

当sql查询的结果必须只有1行(在这种情况下)时,使用LIMIT 1(更高性能)。如果您不使用LIMIT 1并且您的字段不是唯一的,则会检查所有条目的匹配。

http://php.net/manual/en/pdostatement.bindparam.php

  

public bool PDOStatement :: bindParam(mixed $ parameter,mixed&amp; $ variable [,int $ data_type = PDO :: PARAM_STR [,int $ length [,mixed $ driver_options]]])

     

与PDOStatement :: bindValue()不同,该变量被绑定为引用,并且仅在调用PDOStatement :: execute()时进行评估。

bindParam的第二个参数是通过引用传递的变量,因此,在绑定之后定义变量(它必须在execute()之前声明)确实没有问题。但我认为这是一种不好的做法。 如果使用bindValue,则必须在绑定之前声明变量。

您可以编写一个函数或方法来使用try / catch块进行sql查询,这样您就不必每次都编写它:

<?php
$connectionData = [
    "server" => "localhost",
    "user" => "",
    "pass" => "",
    "database" => ""
];

$db = null;

function sqlQuery($query, array $data, $db) {
    $stmt = null;

    try {
        $stmt = $db->prepare($query);

        foreach ($data as $key => $value) {
            $stmt->bindParam(':' . $key, $value);
        }

        $stmt->execute();
    } catch (PDOException $e) {
        $stmt = null;
    }

    return $stmt;
}

try {
    $db = new PDO("mysql:host=" . $connectionData["server"] . ";dbname=" . $connectionData["database"], $connectionData["user"], $connectionData["pass"]);
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e) {
    echo $e->getMessage();
}


$profilePic = "img/default_pic.jpg";
$stmt = sqlQuery("SELECT profile_pic FROM users WHERE username = :username LIMIT 1", array("username" => $username), $db);

if($stmt != null) {
    $userData = $stmt->fetch(PDO::FETCH_ASSOC);

    if(isset($userData) && $userData != false) {
        if(array_key_exists("profile_pic", $userData) && !empty($userData["profile_pic"])) {
            $profilePic = $userData["profile_pic"];
        }
    }
} else {
    echo "SQL Error";
}


echo $profilePic;

if($db !== null) {
    $db = null;
}
?>

在这种情况下,我只需要使用函数 sqlQuery ,在函数内部构建语句,如果有任何类型的错误被捕获,则null将作为响应返回。