【问题标题】:problems with MySQL prepare and executeMySQL准备和执行的问题
【发布时间】:2014-07-05 15:08:37
【问题描述】:

我有一个 1and1 的 V-server。不幸的是,支持不够。
此代码是登录文件的一部分,已经运行了将近 1.5 年。从昨天开始,execute 语句返回 false。 我尝试了不同的东西,但我不知道为什么执行 return false ?

$mail     = "test";
$password = "test";
$prep = "SELECT id FROM member WHERE address=? AND password=?";
if ( $stmt = $mysqli->prepare($prep))
{
$stmt->bind_param( "ss", $mail, $password );
$stmt->execute();
$stmt->bind_result($id);
if ($stmt->fetch())
..........

当我减少 SELECT 语句并删除 AND 时,$stmt->execute() 返回 TRUE。

$mail     = "test";
$password = "test";
$prep = "SELECT id FROM member WHERE address=?";
if ( $stmt = $mysqli->prepare($prep))
{
$stmt->bind_param( "s", $mail );
$stmt->execute();
$stmt->bind_result($id);
if ($stmt->fetch())
..........

当我添加 AND 或 OR 时,它再次失败?

$mail     = "test";
$password = "test";
$prep = "SELECT id FROM member WHERE address=? OR password=?";
if ( $stmt = $mysqli->prepare($prep))
{
$stmt->bind_param( "ss", $mail, $password );
$stmt->execute();
$stmt->bind_result($id);
if ($stmt->fetch())
..........

【问题讨论】:

  • 请记住,托管支持永远不会扩展到调试程序 - 责任始终在于客户。调试是一个明智的主机永远不会进入的雷区。
  • 将错误报告添加到文件顶部error_reporting(E_ALL); ini_set('display_errors', 1); 看看它是否产生任何结果。
  • 如果if 失败,请使用$mysqli 上的相应错误获取器查找错误。 (@Fred 的建议是合理的,但如果您在实时站点上进行了更改,请确保再次将其更改回来 - 实时站点不应启用错误报告)。
  • password 列还存在吗?
  • 感谢您的快速回复。我将添加错误报告,看看我得到了什么。是的,密码仍然存在。当我用密码交换邮件时,选择查询也有效。只有当我在选择中有 2 列时它才会失败。但是执行返回 FALSE。准备和 bind_param 返回 TRUE。我同意一半。但这并不是一个新的发展。这边运行一年多没有变化。我希望房东能告知他们如果一天又一天发生这种情况,他们会发生什么变化。

标签: php mysql select prepared-statement


【解决方案1】:

可能查询变得无效。(我知道它正在工作) 试试看错误报告

printf("%s\n", $mysqli->info);
printf("Errormessage: %s\n", $mysqli->error);

我认为,mysqli bind_param 不能正确使用非英文字母,所以如果你有一些字母或符号...... 尝试将此行放在准备语句之前

$connection->set_charset('utf8');

【讨论】:

  • 错误消息:mysqld_stmt_execute 的参数不正确
  • 好的,这解释了从执行返回 FALSE,但有什么问题?在我的本地主机上,它在同一个 mysql 数据库上运行没有问题??
  • 请把sql查询打印出来,直接在phpmyadmin试试
  • SQL 查询直接在 phpmyadmin 中工作,而不是在准备好的语句中?
  • 在试图找到一个类似的错误:stackoverflow.com/questions/10053955/… 他用 mysql 客户端版本 50095 声明他在准备语句中有多个参数的问题。我的版本是 50096。所以这可能是 mysql 中的类似错误?
【解决方案2】:

检查member表是否存在,是否有idpasswordaddress字段。如果是这样,请尝试直接运行您的查询。看看它是否失败以及错误是什么。另外,请检查您与数据库的连接是否有效。

【讨论】:

  • 那你的连接可能有问题。你能检查一下你的连接吗?
  • 当我修改选择并且只有一行而不是 2 时它也可以工作
  • @user3807924 你能检查一下你在PHP项目中使用到数据库的连接是否正确吗?是还是不是?
  • 连接有效,代码中的所有其他选择都有效,只有准备好的语句?关键是之前已经奏效了。
  • 让我们想想它最后一次起作用和第一次不起作用。两人之间发生了什么?
猜你喜欢
  • 2014-09-16
  • 1970-01-01
  • 1970-01-01
  • 2012-07-20
  • 2019-07-02
  • 1970-01-01
  • 1970-01-01
  • 2019-07-05
  • 2012-10-12
相关资源
最近更新 更多