我在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;
答案 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将作为响应返回。