在SQL查询中使用php函数的参数作为列名

时间:2016-05-12 08:24:32

标签: php mysql sql

这是一个学校项目。我是PHP和MySQL的新手。 我正在尝试使用一个字符串参数在PHP中编写一个函数,该参数将成为在此函数内的prepare()语句中使用的SQL查询的列名。

以下是代码:

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语句中编写参数的不同方法,也可以通过不同的方式在函数调用中编写它。现在我甚至开始认为我的功能根本就没有被调用......

如果我只使用硬编码的列名执行两次函数内部的代码,我想要实现的是什么。但这并不好:)

非常感谢任何帮助。谢谢!

3 个答案:

答案 0 :(得分:3)

向您的函数的参数添加提交的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 的缺点。)

答案 1 :(得分:0)

我的猜测是你的函数不知道$conn,因为它没有在其范围内声明 你的功能应该像这样开始:

global $conn;

有关变量范围的更多信息,请参阅the manual

编辑:

正如apokryfos在评论中指出的那样,不建议使用global。最好将$conn作为参数传递给checkCredentials

有关详细信息,请参阅the accepted answer to this question。引用:

  

函数调用不应该依赖于

以外的任何东西

答案 2 :(得分:0)

我猜您可以像这样修改代码:

$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)。