这是一个学校项目。我是PHP和MySQL的新手。我正在尝试用PHP编写一个带有一个字符串参数的函数,该参数将成为SQL查询的列名,该查询用于该函数中的prepare()语句。
这是代码:
function checkCredentials($dbFieldToCheck) {
$statement = $conn->prepare("SELECT id FROM user WHERE ".$dbFieldToCheck." = ? AND password = PASSWORD(?)");
if (!$statement) die("Prepare failed: (" . $conn->errno . ") " . $conn->error);
$statement->bind_param("ss", $_POST["username/email"], $_POST["password"]);
$statement->execute();
$result = $statement->get_result();
$row = $result->fetch_assoc();
return $row;
}
然后我在两个不同的变量中调用这个函数两次:
$row1 = checkCredentials('email');
$row2 = checkCredentials('username');
最后,我用这两个变量做了一些事情(我想在这里没有用)。
我已经尝试了在SQL语句中写入参数的不同方法,也尝试了在函数调用中写入它的不同方法。现在我甚至开始认为我的函数根本没有被调用。。。
如果我只执行函数内部的代码两次,并且对列名进行硬编码,那么我想要实现的目标就会实现。但这并不好:)
非常感谢您的帮助。谢谢
将提交的POST
数据和连接变量添加到函数的参数中。当你调用你的函数时,它会像这样:
checkCredentials($dbFieldToCheck, $conn, $_POST["username/email"], $_POST["password"]);
你的功能看起来像这样:
function checkCredentials(string $dbFieldToCheck, $conn, $username, $password) {
$statement = $conn->prepare("SELECT id FROM user WHERE ".$dbFieldToCheck." = ? AND password = PASSWORD(?)");
if (!$statement) die("Prepare failed: (" . $conn->errno . ") " . $conn->error);
$statement->bind_param("ss", $username, $password);
$statement->execute();
$result = $statement->get_result();
$row = $result->fetch_assoc();
return $row;
}
您可以使用global
来调用函数内部的变量(您可以参考此处了解使用global
的缺点)。
我的猜测是,您的函数不知道$conn
,因为它没有在其作用域中声明
你的功能应该这样开始:
global $conn;
有关变量范围的更多信息,请参阅手册。
编辑:
正如apokryfos在评论中指出的那样,不建议使用global
。最好将$conn
作为参数传递给checkCredentials
。
有关详细信息,请参阅此问题的公认答案。报价:
函数调用不应该依赖之外的任何东西
我想你可以这样修改你的代码:
$servername = "localhost:3306";//replace with your mysql server address
$username = "username";//replace with your mysql user
$password = "password";//replace with your mysql password
// Create connection
$conn = new mysqli($servername, $username, $password);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
echo "Connected successfully";
function checkCredentials(string $dbFieldToCheck, $conn, $username, $password) {
$statement = $conn->prepare("SELECT id FROM user WHERE ".$dbFieldToCheck." = ? AND password = PASSWORD(?)");
if (!$statement) die("Prepare failed: (" . $conn->errno . ") " . $conn->error);
$statement->bind_param("ss", $username, $password);
$statement->execute();
$result = $statement->get_result();
$row = $result->fetch_assoc();
return $row;
}
checkCredentials('email');
将PHP与MYSQL结合使用并不复杂,本文档可以帮助您了解它们如何协同工作的基本概念(http://www.w3schools.com/php/php_mysql_connect.asp)。