这是我的代码的快照:
$fetchPictures = $PDO->prepare("SELECT *
FROM pictures
WHERE album = :albumId
ORDER BY id ASC
LIMIT :skip, :max");
$fetchPictures->bindValue(':albumId', $_GET['albumid'], PDO::PARAM_INT);
if(isset($_GET['skip'])) {
$fetchPictures->bindValue(':skip', trim($_GET['skip']), PDO::PARAM_INT);
} else {
$fetchPictures->bindValue(':skip', 0, PDO::PARAM_INT);
}
$fetchPictures->bindValue(':max', $max, PDO::PARAM_INT);
$fetchPictures->execute() or die(print_r($fetchPictures->errorInfo()));
$pictures = $fetchPictures->fetchAll(PDO::FETCH_ASSOC);
Run Code Online (Sandbox Code Playgroud)
我明白了
您的SQL语法有错误; 检查与MySQL服务器版本对应的手册,以便在第1行的"15",15'附近使用正确的语法
似乎PDO在SQL代码的LIMIT部分中为我的变量添加单引号.我查了一下我发现了这个我认为相关的错误:http: //bugs.php.net/bug.php?id = 44639
这就是我在看的东西吗?这个bug自2008年4月开始!在此期间我们应该做什么?
我需要构建一些分页,并且需要在发送sql语句之前确保数据是干净的,sql注入安全的.
与MySQLi相比,PDO只是一个相当简单的问题.
使用MySQLi,要关闭连接,您可以执行以下操作:
$this->connection->close();
Run Code Online (Sandbox Code Playgroud)
但是对于PDO,它声明您使用以下命令打开连接:
$this->connection = new PDO();
Run Code Online (Sandbox Code Playgroud)
但要关闭您设置的连接null.
$this->connection = null;
Run Code Online (Sandbox Code Playgroud)
这是正确的,这实际上是否会释放PDO连接?(我知道它确实设置为null.)我的意思是MySQLi你必须调用一个函数(close)来关闭连接.PDO是否易于= null断开?或者是否有关闭连接的功能?
我正在使用这段代码,我感到非常沮丧:
try {
$dbh = new PDO('mysql:dbname=' . DB . ';host=' . HOST, USER, PASS);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$dbh->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, "SET NAMES 'utf8'");
}
catch(PDOException $e)
{
...
}
$stmt = $dbh->prepare('INSERT INTO table(v1, v2, ...) VALUES(:v1, :v2, ...)');
$stmt->bindParam(':v1', PDO::PARAM_NULL); // --> Here's the problem
Run Code Online (Sandbox Code Playgroud)
PDO::PARAM_NULL, null, '', 所有这些都失败并抛出此错误:
致命错误:无法通过/ opt /中的引用传递参数2
我搜索过网络,到目前为止我所看到的是你可以使用mysql_和mysqli_一起意义:
<?php
$con=mysqli_connect("localhost", "root" ,"" ,"mysql");
if( mysqli_connect_errno( $con ) ) {
echo "failed to connect";
}else{
echo "connected";
}
mysql_close($con);
echo "Done";
?>
Run Code Online (Sandbox Code Playgroud)
要么
<?php
$con=mysql_connect("localhost", "root" ,"" ,"mysql");
if( mysqli_connect_errno( $con ) ) {
echo "failed to connect";
}else{
echo "connected";
}
mysqli_close($con);
echo "Done";
?>
Run Code Online (Sandbox Code Playgroud)
有效,但是当我使用这段代码时,我得到的是:
Connected
Warning: mysql_close() expects parameter 1 to be resource, object given in D:\************.php on line 9
Done
Run Code Online (Sandbox Code Playgroud)
对于第一个和相同的除外mysqli_close().对于第二个.
问题是什么?我不能使用mysql_和mysqli在一起?还是正常的?我可以检查连接是否有效吗?(if(mysq...))
这是我的尝试:
$query = $database->prepare('SELECT * FROM table WHERE column LIKE "?%"');
$query->execute(array('value'));
while ($results = $query->fetch())
{
echo $results['column'];
}
Run Code Online (Sandbox Code Playgroud) 更新2:
那么这是最优化的吗?
$DBH = new PDO( "connection string goes here" );
$STH = $DBH -> prepare( "select figure from table1" );
$STH -> execute();
$result = $STH -> fetch();
echo $result ["figure"];
$DBH = null;
Run Code Online (Sandbox Code Playgroud)
更新1:
我知道我可以为sql查询添加限制,但我也想摆脱foreach循环,我不应该这样做.
原始问题:
我有以下脚本,这是一个很好的IMO,因为"foreach"部分,从数据库返回许多行.
如果我知道我将始终只从数据库中获取1行,我该如何优化它.如果我知道我将只从数据库获得1行,我不明白为什么我需要foreach循环,但我不知道如何更改代码.
$DBH = new PDO( "connection string goes here" );
$STH = $DBH -> prepare( "select figure from table1" );
$STH -> execute();
$result = $STH -> fetchAll();
foreach( $result as $row ) {
echo $row["figure"];
}
$DBH = null;
Run Code Online (Sandbox Code Playgroud) 不久前,我被建议更改我的代码以使用PDO来参数化我的查询并安全地将HTML保存在数据库中.
嗯,这是主要问题:
我看了http://php.net/manual/en/ref.pdo-mysql.php,我真的不知道应该把那个$ ./configure --with-pdo-mysql字符串放到哪里......
我正在构建的网站实际上只需要PDO一页.虽然我可能会考虑重写它,但它需要一段时间,我需要很快运行页面,所以我不能完全关闭MySQL.如果我安装PDO,我仍然可以使用mysql_*处理程序吗?
有问题的服务器运行PHP版本5.4.6-1ubuntu1和Apache/2.2.22(Ubuntu).如果重要的话,我也在运行phpMyAdmin数据库.
我知道PDO不支持在一个语句中执行多个查询.我一直在谷歌,发现很少有关于PDO_MYSQL和PDO_MYSQLND的帖子.
PDO_MySQL是一个比任何其他传统MySQL应用程序更危险的应用程序.传统的MySQL只允许一个SQL查询.在PDO_MySQL中没有这样的限制,但是您可能会注入多个查询.
From:使用PDO和Zend Framework防止SQL注入(2010年6月;作者Julian)
似乎PDO_MYSQL和PDO_MYSQLND确实支持多个查询,但我无法找到有关它们的更多信息.这些项目是否已停止?现在有没有办法使用PDO运行多个查询.
在散列它们并将它们存储在我的数据库中之前,我应该如何逃避或清除用户提供的密码?
当PHP开发人员考虑出于安全目的而考虑哈希用户的密码时,他们往往会像对待任何其他用户提供的数据一样考虑这些密码.这个主题经常出现在与密码存储相关的PHP问题中; 开发人员经常希望使用诸如escape_string()(在各种迭代中)等功能清理密码htmlspecialchars(),addslashes()然后再对其进行散列并将其存储在数据库中.
我不时会看到有关连接数据库的问题.
大多数答案不是我这样做的方式,或者我可能没有正确得到答案.无论如何; 我从来没有想过这个,因为我这样做对我有用.
但这是一个疯狂的想法; 也许我这样做是错的,如果是这样的话; 我真的想知道如何使用PHP和PDO正确连接到MySQL数据库并使其易于访问.
我是这样做的:
首先,这是我的文件结构(剥离):
public_html/
* index.php
* initialize/
-- load.initialize.php
-- configure.php
-- sessions.php
Run Code Online (Sandbox Code Playgroud)
index.php
在最顶端,我有require('initialize/load.initialize.php');.
load.initialize.php
# site configurations
require('configure.php');
# connect to database
require('root/somewhere/connect.php'); // this file is placed outside of public_html for better security.
# include classes
foreach (glob('assets/classes/*.class.php') as $class_filename){
include($class_filename);
}
# include functions
foreach (glob('assets/functions/*.func.php') as $func_filename){
include($func_filename);
}
# handle sessions
require('sessions.php');
Run Code Online (Sandbox Code Playgroud)
我知道有更好或更正确的方法来包含类,但不记得它是什么.还没有时间去研究它,但我认为这是有道理的autoload.类似的东西......
configure.php
这里我基本上只是覆盖一些php.ini -properties并为该站点做一些其他的全局配置
connect.php
我把连接放到一个类上,所以其他类可以扩展这个...
class …Run Code Online (Sandbox Code Playgroud)