这是我的代码的快照:
$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注入安全的.
我这两个功能之间的混淆Bindvalue()
和BindParam()
%
和_
,所以使用时要小心LIKE
.所以我认为BindValue()
在使用LIKE查询时不会使用.LIKE
查询时BindParam()
.因为我知道BindParam可以逃避这些%
和_
.BindValue()
没有防止sql注入.我不确定这个,是真的吗?朋友告诉我在这3点中提到的是对还是错.我是PDO的初学者所以请清楚解释一下..
的PDOStatement对象:: bindValue()方法提供了一种方式来指定绑定的变量的类型:
PDOStatement :: bindValue($ parameter,$ value [,$ data_type = PDO :: PARAM_STR ])
我想知道,指定数据类型的目的是什么,而当作为default(PARAM_STR
)离开时,数据库最终会在使用它之前将值转换为正确的类型?
例如,如果您对INTEGER
字段进行了以下查询:
INSERT INTO table (integerField) VALUES (?) ;
SELECT * FROM table WHERE integerField = ? ;
Run Code Online (Sandbox Code Playgroud)
并且您在PHP中绑定一个整数,PDO默认将它绑定为一个字符串,这相当于:
INSERT INTO table (integerField) VALUES ("1") ;
SELECT * FROM table WHERE integerField = "1" ;
Run Code Online (Sandbox Code Playgroud)
这将完美地工作,因为SQL数据库(至少MySQL,我真的不知道它将如何在其他RDBMS上工作)知道如何在使用它之前将字符串转换回整数.
有哪些用例会对绑定的类型参数与字符串产生影响?
$query = $connect->prepare("SELECT users.firstname, users.lastname, users.id
FROM users INNER JOIN users_friends ON users.id=users_friends.uID
WHERE bID=:USER AND type =:type AND accepted = '1' AND (users.firstname LIKE '%:queryString%' OR users.lastname LIKE '%:queryString%')
LIMIT 10");
$query->bindValue(":queryString", $queryString);
$query->bindValue(":type", $type);
$query->bindValue(":USER", $USER);
$query->execute();
Run Code Online (Sandbox Code Playgroud)
这就是我所拥有的.
我尝试bindValue然后在预准备语句中使用它时出错(%:queryString%)
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens'
Run Code Online (Sandbox Code Playgroud)
我怎么解决这个问题?
我知道这已被问过1000次了,但由于某种原因,我继续在墙上再次敲打我的脑袋.
这有效:
$sql = 'SELECT a.eventCode, a.eventTime, a.teamCode, a.playerCode, b.lastName, b.firstName, b.number, a.xCoord, a.yCoord, a.id ';
$sql = $sql . 'FROM events a, players b ';
$sql = $sql . 'WHERE a.regGUID in ( ' . $regGUID . ' ) and ';
$sql = $sql . 'a.playerCode=b.playerCode and a.gameCode = "' . $game . '" order by a.eventTime desc, a.actionCode asc';
$stmt = $db->prepare($sql);
$results = $stmt->execute();
Run Code Online (Sandbox Code Playgroud)
这不是:
$sql = 'SELECT a.eventCode, a.eventTime, a.teamCode, a.playerCode, b.lastName, b.firstName, b.number, a.xCoord, a.yCoord, …
Run Code Online (Sandbox Code Playgroud) 使用显式数据类型有PDO::bindValue()
什么意义?
例如,在以下任何一种形式中都会有 SQLSTATE[HY000]: General error: 1366 Incorrect integer value: 'a'
$pdos->bindValue(':Value_For_An_Int_Col', 'a');//default arg for the third and opt par is PDO::PARAM_INT
$pdos->bindValue(':Value_For_An_Int_Col', 'a', PDO::PARAM_INT);
Run Code Online (Sandbox Code Playgroud) 我试图使用"where in"子句获取顶级信息但如果我使用bindvalue或bindparam我没有得到任何结果.
这是我的查询没有给出任何结果
$user2 = $db->prepare("Select top 100 memb_guid,memb___id,mail_addr,Gender,Country from MEMB_INFO where memb___id in (Select memb___id from MEMB_STAT where IP = :ip)");
$user2->bindValue(':ip','127.0.0.1',PDO::PARAM_STR);
$user2->execute();
Run Code Online (Sandbox Code Playgroud)
如果我使用没有任何绑定值或参数的直接搜索,我会得到结果
$user2 = $db->prepare("Select top 100 memb_guid,memb___id,mail_addr,Gender,Country from MEMB_INFO where memb___id in (Select memb___id from MEMB_STAT where IP = '127.0.0.1')");
$user2->execute();
Run Code Online (Sandbox Code Playgroud)
任何人都可以帮助我在这个搜索'where in'子句中使用bindvalue或param吗?
@PhilCross这是我在使用var_dump时得到的:
object(PDOStatement)#4 (1) { ["queryString"]=> string(142) "Select top 100 memb_guid,memb___id,mail_addr,Gender,Country from MEMB_INFO where memb___id in (Select memb___id from MEMB_STAT where IP = :ip)"
Run Code Online (Sandbox Code Playgroud)
Ps:我正在使用MSSQL Server
我正在尝试建立一个注册/登录系统.要检查是否未使用用户名和电子邮件地址,我使用此:
$username = $_POST['uLogin'];
$usernameLC = strtolower($username);
$query1 = $db0->query("SELECT userLogin FROM tbuser WHERE userLogin=':login';");
$query1->bindValue(":login", $usernameLC, PDO::PARAM_STR);
Run Code Online (Sandbox Code Playgroud)
但它不起作用.我可以使用相同的用户名创建尽可能多的用户.通过扩展,它也不会让我连接到网站,因为它没有绑定值或任何东西,所以它无法将我的用户名与数据库中的用户名进行比较.
当我像这样使用它时,验证用户名是否有效
$username = $_POST['uLogin'];
$usernameLC = strtolower($username);
$query1 = $db0->query("SELECT userLogin FROM tbuser WHERE userLogin='$usernameLC';");
Run Code Online (Sandbox Code Playgroud)
但这不是正确的方法:/
有人可以帮忙吗?:)
是的,当我尝试在之前看起来像这样的变量上使用bindvalues时,我遇到了问题:
users.firstname LIKE '$firstname%'
Run Code Online (Sandbox Code Playgroud)
现在它看起来像这样:
users.firstname LIKE ':firstname%'
Run Code Online (Sandbox Code Playgroud)
但它不起作用,也试过这个:
users.firstname LIKE :firstname%
Run Code Online (Sandbox Code Playgroud)
并得到一些语法错误..
对此有什么正确的解决方案?我还想在bindValue中添加%(:firstname,$ firstname%),但我还需要在其他地方使用:firstname,不应该有%..
谢谢你
到目前为止,我一直在使用PDO->bindParam
阅读手册,我PDO->bindValue
从我可以告诉的PDO->bindValue
传递值中找到PDO->bindParam
通过引用传递,这是唯一的区别吗?
$modThread = db()->prepare("UPDATE `threads` SET `modtime` = UNIX_TIMESTAMP( ) WHERE `threadid` =:id LIMIT 1");
while(something)
{
$modThread->bindParam(':id', $thread);
$modThread->execute();
//*******************HERE********************//
}
Run Code Online (Sandbox Code Playgroud)
在阅读手册时我发现:PDO->closeCursor
我应该把它放在标记的位置吗?它是可选的/自动调用的吗?似乎只有某些司机需要它.是否会在不需要/支持它的驱动程序上调用它会导致错误?MySQL怎么样?
我正在编写一个以编程方式创建给定某些列名称的表的类.我正在使用PDO准备的语句,这似乎导致了一些问题.
这是基本程序:
// create a query string to be sent to $pdo->prepare
$sql =
'CREATE TEMP TABLE :tmp_table_name (
:person_id bigint,
:encntr_id bigint,
:prsnl_id bigint,
:program_detail text,
:program_name text
);';
$stmt = $pdo->prepare($sql);
// Bind table name
$stmt->bindValue(':tmp_table_name', 'tmp_patients', PDO::PARAM_STR);
// Bind column names
$columnNames = [
'person_id',
'encnt_id',
'prsnl_id',
'program_detail',
'program_name',
];
foreach($columnNames as $name) {
$stmt->bindValue(':'.$name, $name, PDO::PARAM_STR);
}
$ret = $stmt->execute();
// $ret is false! The statement fails.
Run Code Online (Sandbox Code Playgroud)
这是$stmt->errorInfo()[2]
显示的内容:
ERROR: syntax error at or near …
Run Code Online (Sandbox Code Playgroud) 我是PHP的新手,我正在努力获得准备好的声明.这是我在大学的最后一年项目,我记得读过准备好的陈述是很好的做法,也适合SQL注入.但是,以下代码给出了Server 500错误.
<?php
$email = "blah@blah.co.uk";
$hash = "somerandomhashedpassword";
$db = new mysqli("localhost", "root", "1234", "UEAnetwork");
$sql = "INSERT INTO Students (Email, Password) VALUES (?,?)";
$stmt = $db->prepare($sql);
$stmt->bindValue(1, $email);
$stmt->bindValue(2, $hash);
if ($stmt->execute()) {
echo "You have registered!!!!!!!!!!!!!!!!!!!!!!!!!!!!";
}
?>
Run Code Online (Sandbox Code Playgroud)
如果我运行以下内容然后插入一行,所以我很确定我正确连接到数据库.
<?php
$db = new mysqli("localhost", "root", "1234", "UEAnetwork");
$sql = "INSERT INTO Students (Email, Password) VALUES ('blah@blah.co.uk','somerandomhashedpassword')";
$stmt = $db->prepare($sql);
if ($stmt->execute()) {
echo "You have registered!!!!!!!!!!!!!!!!!!!!!!!!!!!!";
}
?>
Run Code Online (Sandbox Code Playgroud)
我使用bindValue
不正确吗?我已经看到它在网上的许多教程中使用这种方式,但我一定做错了.
bindvalue ×13
pdo ×12
php ×12
mysql ×5
sql ×4
bindparam ×3
pdostatement ×1
placeholder ×1
postgresql ×1
where ×1