从mysqli的更改为PDO
我没有这个代码出现问题,将会令人惊讶的正常工作,但我真不明白它是如何工作的,甚至是它的权利,所以:从mysqli的更改为PDO
我与mysqli的查询阿贾克斯后或者获得电话都是这样的:
$con = mysqli_connect('localhost','root','','db') or die(header('Location: ./404.php'));
$add = "INSERT INTO table (id, id2, id3) VALUES('','$fid','')";
if(mysqli_query($con, $add)){
echo "added";
}
$remove = "DELETE FROM table WHERE id2='$fid'";
if(mysqli_query($con, $remove)){
echo "removed";
}
$getInfo = "SELECT * FROM table";
$result = $con->query($getInfo);
if($result->num_rows > 0) {
while($row = $result->fetch_assoc()){
//do something
}
}
并为$_POST or $_GET values I used mysqli_real_escape_string
这里被转化为PDO:
try{
$con = new PDO('mysql:host=localhost;dbname=db;charset=utf8mb4', 'root', '', array(PDO::ATTR_EMULATE_PREPARES => false, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
$get = $con->query("SELECT * FROM table");
foreach($get->fetchAll(PDO::FETCH_ASSOC) as $row){
$data['0'] = $row['name'];
$data['1'] = $row['email'];
return $data;
}
$add = $con->prepare("INSERT INTO table (id, id2, id3) VALUES(:f1,:f2,:f3)");
$add->execute(array(':f1' => '', ':f2' => $fid, ':f3' => ''));
echo "added";
$remove = $con->prepare("DELETE FROM table WHERE id2=:f1");
$remove->bindValue(':f1', $fid, PDO::PARAM_STR);
$remove->execute();
echo "removed";
}catch(PDOException $ex){
echo "error";
}
现在这个工程,但我真的不知道它是否正确写入pdo,我不需要使用像mysqli或类似的东西mysqli_real_escape_string的东西。 和所有我能找到的网页是,它现在是如何写的什么部分代码是干什么例如,当我在mysqli的插入,更新使用或删除我用什么
if(mysqli_query($con, $sql)){echo "success";}else echo 'fail';
我怎样才能做到这一点与PDO ? 也为使用尝试和捕获我不知道我需要使用它的每个查询或我上面添加?
只是再说我是新来的PDO,我不明白它非常好,从上面的作品这个代码,但我不知道是它写的正确方法?
首先,让我祝贺你与PDO一起去。我知道所有经验丰富的PHP开发人员中,他们几乎一致认为他们更喜欢PDO到mysqli。
我强烈建议你read through this guide使用PDO。它应该回答你所有的问题,甚至回答你将来可能会有的一些问题。
为了您的具体问题:
不,你不因为你是使用预处理语句使用占位符不需要再逃避什么,这么久。转义存在的原因正是因为人们将变量插入到SQL语句中,并且可能会混淆需要包含字符串的引号。
随着这个问题已经不存在准备好的语句,这也意味着,不再有SQL注入的危险。 SQL注入利用字符串连接将原始SQL语句转换为完全不同的语句,再次使用引号,这就是为什么从用户输入接受的非转义字符串是SQL注入的攻击媒介。这两个问题都是使用参数和预准备语句解决的
至于PDO的错误处理,你想利用PDO::ERRMODE_EXCEPTION
这是讨论in the manual here。
不幸的是,PDO默认为PDO::ERRMODE_SILENT
基本上忽略数据库错误,只是设置你就必须检查自己PDO对象变量。
虽这么说,你可以在创建PDO连接对象或只是事后添加的错误方式解决这个问题。示例位于链接的PDO错误模式页面上。
至于的try-catch块,一般的例外是不是你想要的,除非你有一些功能代码来解决该错误专门捕获的东西。包装每个SQL调用,以便您可以报告错误消息是坏的,无论是从DRY的角度来看,还是一个反模式。在适当的错误模式下,SQL错误会抛出异常,您可以在错误处理程序中处理异常,并且通常情况下,您不应该继续使用这些异常。
您的错误处理程序应该(在生产中)将错误记录到磁盘/向系统管理员或网站所有者发送电子邮件,并显示专业外观的非特定错误消息,通知用户该问题以及应该发生的所有异常。
在这里你去我的朋友:https://phpdelusions.net/pdo – gview
@gview谢谢你,有人下面投票答案下面没有解释,你可能会给一个为什么他的答案是错的? –
为您提供了详细的答案,希望它有帮助。此外,我非常怀疑你的手柄是否准确 - 你显然不是一个愚蠢的孩子;) – gview