【问题标题】:Change PDO in mysqli更改 mysqli 中的 PDO
【发布时间】:2013-07-08 12:55:56
【问题描述】:

我在mysqli中更改了PDO的连接类型。

PDO_conection

<?php
try {
$pdo = new PDO('mysql:host=localhost;dbname=exercise', 'root', 'root');
} catch (PDOException $e){
exit('Datebase error.');
}
?>

mysqli_conection

<?php
$host = "localhost";
$username = "root";
$password = "root";
$dbname = "exercise";
$mysqli = new mysqli($host, $username, $password, $dbname);
if(mysqli_connect_errno()) {
echo "Error: Could not connect to database.";
exit;
}
?>

现在正在尝试在 mysqli 中更改 PDO 中编写的一段代码。

PDO_code

$query = $pdo->prepare("SELECT * FROM users WHERE user_name=? AND user_password=? LIMIT 1");
        $query->bindValue(1, $username, PDO::PARAM_STR);
        $query->bindValue(2, $password, PDO::PARAM_STR);
        $query->execute();
        $num = $query->rowCount();
        $row = $query->fetch(PDO::FETCH_ASSOC);

这是我尝试在 mysqli 中改变它

mysqli_code

$query = $mysqli->prepare("SELECT * FROM users WHERE user_name=? AND user_password=? LIMIT 1");
    $query->bind_result($username, $password);
        $query->execute();
        $num = $query->num_rows;
    $row = $query->fetch_assoc();

我哪里错了?

【问题讨论】:

  • 这是一个罕见的过渡。我很想知道为什么要这样?除此之外。您的 mysqli 代码是错误的。你需要给自己一个教程并跟随它。
  • 第一个看起来非常糟糕“SELECT * FROM users WHERE user_name=? AND user_password=?”,我不会抨击选择所有列,但是按用户名和密码选择看起来真的很阴暗.为什么不直接从username = post/get username的用户那里获取密码,然后使用php密码功能进行比较呢?主题:你有什么错误吗?

标签: php pdo mysqli


【解决方案1】:

这里有个问题:

$query = $mysqli->prepare("SELECT * FROM users WHERE user_name=? AND user_password=? LIMIT 1");
$query->bind_result($username, $password);//<==
$query->execute();
$num = $query->num_rows;
$row = $query->fetch_assoc();

绑定结果将传递的变量绑定到结果集,而您想要bind_param

$query->bind_param('ss', $username, $password);

在那之后你仍然必须使用bind_result,而忘记fetch_assoc。一个mysqli_stmt 只有一个fetch 方法:

$query->bind_result($id, $field2);//one var per table field...
while($query->fetch())
{
    echo $id.', '.$field1;
}

我认为不推荐SELECT * 的原因很明显......

此外,为了保持一致性,将mysqli_connection_error() 更改为if ($mysqli-&gt;connect_error) 或其他内容。 mysqli_* 提供程序和 OO 风格,但请不要将两者混为一谈。
根据文档,您不能使用它,正如 YourCommonSense 向我指出的那样,因为它在 PHP 5.2.9 和 5.3.0 之前被破坏了。建议保留程序检查以确保兼容性。

完整的:

$stmt = $mysqli->prepare('SELECT id FROM users WHER user_name = ? AND user_password = ?');
$stmt->bind_param('ss', $username, $password);
$stmt->execute();
$stmt->bind_result($id);
//or, in your case
$result = $stmt->get_result();
$row = $result->fetch_assoc();
$numRows = $result->num_rows;

使用get_resultsave_resultfree_result、... 方法,然后使用从语句which has all the goodies you're after 获得的mysqli_result 实例

【讨论】:

  • 请花点时间尝试运行您编写的代码。然后知道你的大部分建议显然是错误的。
  • @YourCommonSense:好的,很公平。我对mysqli_* 不太熟悉,但我正在尝试使用mysqli_result ATM 做一些事情。老实说,我不知道,所以一旦我发现更多信息,我会回到这个答案
  • 现在好多了。 mysqli_connection_error() to if ($mysqli-&gt;connect_error)也是可以尝试的。
  • mysqli_connection_error() to if ($mysqli-&gt;connect_error) 也是一种尝试然后发现它永远不会起作用
  • 谢谢,我的信息已经过时了。顺便说一句,我并不是在提倡 mysqli。我的意见取决于目标。如果您正在寻找构建抽象类的 API,以封装所有这些奇怪的 bind_* 东西和 call_user_func_arrays - 我推荐 mysqli。如果您遵循在应用程序代码中使用原始 API 函数的习惯,那么 PDO 将是唯一明智的选择。
猜你喜欢
  • 2018-02-07
  • 2020-01-29
  • 1970-01-01
  • 1970-01-01
  • 2019-09-04
  • 2012-05-28
  • 2013-08-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多