Php 特定的MySQL Select查询到PDO Select查询

Php 特定的MySQL Select查询到PDO Select查询,php,mysql,pdo,Php,Mysql,Pdo,我在mySQL中得到了这个select查询。尝试将其更改为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

我在mySQL中得到了这个select查询。尝试将其更改为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;
      }
如果用户表中的profile_pic字段中没有存储任何内容,则变量$profile_pic应为默认图像,如果用户表中的profile_pic中存储有位置,则其应为$profile_pic=“userdata/pp/”$profile_pic db

附带问题:

最后,一个附带问题,我是否必须为每个插入查询键入“try”、“catch”和“new 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;

您不必每次都使用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行时(在本例中是这样),请使用限制1(更高的性能)。如果不使用限制1且字段不唯一,则将检查所有条目是否匹配

public bool PDOStatement::bindParam(混合$parameter,混合和$variable[,int$data_type=PDO::PARAM_STR[,int$length[,混合$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,函数内部的语句是build,如果捕获到任何类型的错误,将返回null作为响应。

问题是什么?您当前没有使用PDO编写select。据我所知,您可能将
mysql\uUcode>查询与PDO混合在一起,如果我在这里出错,请纠正我。您也在这里把马放在马车前面
$stmt->bindParam(':name',$name)$名称=$_POST['name']
并且使用了错误的变量
$user,$password)
@chris85问题是如何在PDO中执行select查询(mysql查询)。。。Fredd-ii-我不会把PDO和mysql混合在一起。。是的,变量名对于我要问的问题并不重要,…显然有两个问题。我如何在PDO中执行mysql查询?其次,我是否每次都需要在insert查询周围放置try和catch子句?谢谢,这正是我想要的,非常好。您今天过得很好,先生。我的连接脚本位于不同的php文件中
使用
包含
require_once('connect.inc.php')是否更好
require与include完全相同,除非失败时,它还会产生致命的E\u编译错误级别错误。换句话说,它将停止脚本,而include只发出一个警告(E_警告),允许脚本继续So include将在找不到文件时生成警告,require将生成致命错误。include_once/require_once之间的区别在于,如果文件已经包含,则不会再次包含该文件。所以我推荐你一次。您应该只包含此文件一次,并且您必须拥有它。