Php 特定的MySQL Select查询到PDO Select查询
我在mySQL中得到了这个select查询。尝试将其更改为PDO。这个问题并不是完全重复的,因为其他答案并没有确切说明如何做到这一点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
$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之间的区别在于,如果文件已经包含,则不会再次包含该文件。所以我推荐你一次。您应该只包含此文件一次,并且您必须拥有它。