我读过PDO的书。如何使用MySQL或MSSQL将代码更新为PDO?
我看到了很多关于SO实现my_sql函数的代码。以及来自其他人(包括我自己)的评论,迫使提问者放弃MySQL函数,开始使用PDO或MySQLI。这个帖子是来帮忙的。您可以参考它,因为它提供了为什么不推荐它们和什么是PDO的解释,以及实现PDO的最小代码示例。
首先:
从mysql函数到PDO的转换不是简单的搜索和替换。PDO是PHP语言的面向对象编程。这意味着编写代码的另一种方法,就像使用mysql函数一样。首先,为什么要皈依?
连接到MySQL数据库,先决条件
这相当简单,不需要预先设置PHP。现代PHP安装是标准的,附带了一个允许PDO连接到MySQL服务器的模块。
该模块是php_pdo_mysql.dll
$connection = new PDO(arguments);
PDO构造函数接受1个必需参数和3个可选参数。
连接到MySQL
$dsn = 'mysql:dbname=databasename;host=127.0.0.1';
$user = 'dbuser';
$password = 'dbpass';
$dbh = new PDO($dsn, $user, $password);
$dsn = 'sqlsrv:Server=127.0.0.1;Database=databasename';
$user = 'dbuser';
$password = 'dbpass';
$dbh = new PDO($dsn, $user, $password);
您需要将PDO实例创建封装在try-catch子句中。如果创建失败,将显示一个返回跟踪,显示有关应用程序的关键信息,如用户名和密码。为了避免这种情况,请捕捉错误。
try
{
$connection = new PDO($dsn, $user, $password);
}
catch( PDOException $Exception )
{
echo "Unable to connect to database.";
exit;
}
若要抛出SQL server返回的错误,请使用setattribute
:$connection->setattribute(PDO::attr_errmode,PDO::errmode_exception);
将以下选项添加到PDO实例中
PDO使用准备好的语句。这是PDO方法和mysql函数之间的真正区别。后者非常容易受到SQL注入的影响。可以构建如下查询:
$SQL = 'SELECT ID FROM users WHERE user = '.$username ;
$SQL = 'SELECT ID, EMAIL FROM users WHERE user = :username';
注意差异;不是在字符串外使用$
引入PHP变量,而是在字符串内使用:
引入变量。另一种方式是:
$SQL = 'SELECT ID, EMAIL FROM users WHERE user = ?';
如何执行实际查询
PDO实例提供了两种执行查询的方法。当没有变量时,可以使用query()
,对于变量使用prepare()
。query()
在调用时立即执行。请注意调用的面向对象方式(->
)。
$result = $connection->query($SQL);
$connection->prepare($SQL, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
$queryArguments = array(':username' => $username);
对于索引变量(?
):
$queryArguments = array($username);
添加了所需的所有变量后,可以调用方法execute()
来执行查询。从而将数组作为参数传递给函数execute
。
$result = $connection->execute($queryArguments);
bindValue
bindValue方法允许您将值绑定到PDO实例。该方法接受两个必需参数和一个可选参数。可选参数设置值的数据类型。
$connection->bindValue(':username', $username);
$connection->bindValue(1, $username);
$result = $connection->execute();
注意:您只能使用一个命名变量一次!两次使用它们将导致执行查询失败。根据您的设置,这将引发或不引发错误。
同样,我将只讨论从返回的集合中获取结果的基础知识。PDO是一个相当高级的附加组件。
使用fetch
和fetchall
ID EMAIL
1 someone@example.com
Array
(
[ID] => 1
[0] => 1
[EMAIL] => someone@example.com
[1] => someone@example.com
)
while($row = $result->fetch())
{
echo $row['ID'];
echo $row['EMAIL'];
}
您可以在这里找到其他选项:fetch_style;
FetchAll
获取单个数组中的所有行。使用与fetch
相同的默认选项。
$rows = $result->fetchAll();
如果使用的查询不返回结果,如插入或更新查询,则可以使用rowcount
方法检索受影响的行数。
class pdoConnection {
public $isConnected;
protected $connection;
public function __construct($dsn, $username, $password, $options = array()) {
$this->isConnected = true;
try {
$this->connection = new PDO($dsn, $username, $password, $options);
$this->connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$this->connection->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); //sets the default to return 'named' properties in array.
} catch (PDOException $e) {
$this->isConnected = false;
throw new Exception($e->getMessage());
}
}
public function disconnect() {
$this->connection = null;
$this->isConnected = false;
}
public function query($SQL) {
try {
$result = $this->connection->query($SQL);
return $result;
} catch (PDOException $e) {
throw new PDOException($e->getMessage());
}
}
public function prepare($SQL, $params = array()) {
try {
$result = $this->connection->prepare($SQL);
$result->execute($params);
return $result;
} catch (PDOException $e) {
throw new PDOException($e->getMessage());
}
}
}
$dsn = 'mysql:dbname=databasename;host=127.0.0.1';
$user = 'dbuser';
$password = 'dbpass';
$db = new pdoConnection($dsn, $user, $password);
$SQL = 'SELECT ID, EMAIL FROM users WHERE user = :username';
$result = $db->prepare($SQL, array(":username" => 'someone'));
while($row = $result->fetch())
{
echo $row['ID'];
echo $row['EMAIL'];
}
问题内容: 在php.net上阅读有关 MySQL函数的信息时 。我遇到了这个消息 警告此扩展自PHP5.5.0起不推荐使用,以后将被删除。相反,应使用MySQLi或PDO_MySQL扩展。另请参见MySQL:选择API指南和相关的FAQ,以获取更多信息。此功能的替代方法包括: mysqli_connect() PDO :: __ construct() 我已经了解了PDO。如何使用MySQL或M
问题内容: 我一直在做的简单连接,: 虽然使用这个我一直使用的简单的方法,使查询之前逃脱的任何数据,不管是,,或者通过使用 现在我知道这在一定程度上是安全的! 它逃脱了危险人物;但是,它仍然容易受到其他攻击的攻击,这些攻击可能包含安全字符,但可能有害于显示数据或在某些情况下恶意修改或删除数据。 因此,我进行了一些搜索,以了解有关PDO,MySQLi和准备好的语句的信息。是的,我可能迟到了游戏,但是
我用Mockito写UT,我想替换我的mock函数(哪个DB选择操作) 使用我在测试类中编写的新函数(使用map模拟数据库选择); 我想用正确的键输入返回正确的值 我试图这样做使用ArgumentCaptor如下,但它没有工作,因为我想 我想当调用dataBaseSelect.selectDataFromDB时,它将被模拟,然后从MapSelect.selectDataFromMap返回结果,参数
本文向大家介绍如何在MySQL中用SPACE替换“ +”(加号)?,包括了如何在MySQL中用SPACE替换“ +”(加号)?的使用技巧和注意事项,需要的朋友参考一下 要替换,请使用MySQL中的函数。让我们首先创建一个表- 使用插入命令在表中插入一些记录- 使用select语句显示表中的所有记录- 这将产生以下输出- 以下是用空格替换“ +”(加号)的查询- 让我们再次检查表记录- 这将产生以下
问题内容: 在这个查询中 我正在尝试将变量与PDO 绑定。不确定最后如何处理。 可不可能是 绑定到哪里 还是会 绑定到哪里 还是会完全不同? 问题答案: 您还可以说: 在MySQL末尾进行字符串连接,并不是在这种情况下有任何特殊原因。 如果要查找的部分本身可以包含百分比或下划线字符(因为这些字符对LIKE运算符具有特殊含义)或反斜杠(MySQL用作LIKE运算符的另一种转义层),则事情会变得更加棘
本文向大家介绍MySQL REPLACE()函数如何替换多个记录中的字符串?,包括了MySQL REPLACE()函数如何替换多个记录中的字符串?的使用技巧和注意事项,需要的朋友参考一下 如果要替换多个记录中的字符串,则函数必须将列名称作为第一个参数,即在字符串的位置。这意味着它将用该特定列中的另一个子字符串替换所有子字符串。我们还可以将WHERE子句与UPDATE语句一起使用,以应用条件。通过以