gpt4 book ai didi

MySQL 的 PHP PDO 参数化查询

转载 作者:行者123 更新时间:2023-11-29 05:41:39 24 4
gpt4 key购买 nike

全部,

我正在尝试编写一个函数来检查我的 users 表中是否已经存在用户名或用户电子邮件。这将用作用户注册期间的支票。

我希望能够使用相同的功能来检查电子邮件或姓名是否存在。我会通过向它发送 2 个字符串变量来使用该函数,一个 $tableColName 代表 db 表中的列(因此“userName”或“userEmail”,以及一个 $userIdentifier,代表用户名或用户电子邮件我想查询。

我写了以下内容(修改为独立的):

<?php
$dbHost="localhost";
$dbName="project";
$dbUser="admin";
$dbPassword="abcd";
$dbh=new PDO("mysql:host=$dbHost;dbname=$dbName", $dbUser, $dbPassword);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$userIdentifier="apple"; // Or "apple@gmail.com", which is an email
$tableColName="userName"; // Or "userEmail"
$sth=$dbh->prepare("SELECT * FROM users WHERE :tableColName = :userIdentifier");
$sth->bindParam(":tableColName", $tableColName);
$sth->bindParam(":userIdentifier", $userIdentifier);
$sth->execute();
print("PDO::FETCH_ASSOC: ");
print("Return next row as an array indexed by column name");
echo "</br>";
$result = $sth->fetch(PDO::FETCH_ASSOC);
print_r($result);
echo "</br>";
if ($result==null){
print("FALSE - result is null");
}else{
print("TRUE - result isn't null");
}
?>

这行不通。有效的查询是我直接在查询中指定列名而不是使用参数,但我失去了我寻求的灵 active :

<?php
$dbHost="localhost";
$dbName="project";
$dbUser="admin";
$dbPassword="abcd";
$dbh=new PDO("mysql:host=$dbHost;dbname=$dbName", $dbUser, $dbPassword);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$userName="apple";
$sth=$dbh->prepare("SELECT * FROM users WHERE userName = :userIdentifier"); // Cannot be used for userEmail search.
$sth->bindParam(":userIdentifier", $userName);
$sth->execute();
print("PDO::FETCH_ASSOC: ");
print("Return next row as an array indexed by column name");
echo "</br>";
$result = $sth->fetch(PDO::FETCH_ASSOC);
print_r($result);
echo "</br>";
if ($result==null){
print("FALSE - result is null");
}else{
print("TRUE - result isn't null");
}
?>

我做错了什么?

谢谢,

JDelage

最佳答案

+1 是因为我对 PDO 的热爱!

关于你的issue friend ,PDO中不能将表名和列名作为参数传递。 Refer to this post for more info .

我相信使用好的旧变量(当然是经过过滤的!)对您来说会很好。

 $tableName = "email";
$sth=$dbh->prepare("SELECT * FROM users WHERE $tableName = :userIdentifier");

$sth->bindParam(":userIdentifier", $userIdentifier);
$sth->execute();

未经测试,但它应该能让您入门。此外,请记住过滤 $tableName,这是一个(许多)简单的方法,可以使用一个包含允许表名的白名单的简单数组来完成,这是一个简单的例子:

$validTables = array('email', 'username');

if(!in_array($tableName, $validTables)){
throw new Exception("Invalid Table Name");
}

关于MySQL 的 PHP PDO 参数化查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6366661/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com