【问题标题】:How does SQL logic in this php 'know' what to select?这个 php 中的 SQL 逻辑如何“知道”选择什么?
【发布时间】:2014-02-04 10:11:41
【问题描述】:

如果标题不好,我很抱歉。

我一直在研究Prepared Statements,发现如下代码here

  /* Create a new mysqli object with database connection parameters */
   $mysqli = new mysqli('localhost', 'username', 'password', 'db');

   if(mysqli_connect_errno()) {
      echo "Connection Failed: " . mysqli_connect_errno();
      exit();
   }

   /* Create a prepared statement */
   if($stmt = $mysqli -> prepare("SELECT priv FROM testUsers WHERE username=?
   AND password=?")) {
  /* Bind parameters
     s - string, b - blob, i - int, etc */
  $stmt -> bind_param("ss", $user, $pass);

  /* Execute it */
  $stmt -> execute();

  /* Bind results */
  $stmt -> bind_result($result);

  /* Fetch the value */
  $stmt -> fetch();

  echo $user . "'s level of priviledges is " . $result;

  /* Close statement */
  $stmt -> close();
  }

  /* Close connection */
  $mysqli -> close();

我不明白的部分是,在SQL Query "SELECT priv FROM testUsers WHERE username=? AND password=?") 中,系统如何知道用户名和密码是什么。我知道那个?标记是占位符,下面也让我有点困惑:

$stmt -> bind_param("ss", $user, $pass);

因为我看不到$user$pass 在任何时候是如何定义的,因此SQL 查询将如何用$user$pass 替换实际的字符串。如果这是有道理的。这些价值观从何而来?在这个例子中它们在哪里?

【问题讨论】:

  • 必须有一些额外的代码为$user$pass 赋值。本文假设它们在别处初始化。
  • 您必须从发布它们的表单中获取 $user 和 $pass。可能在您发布的脚本中被遗漏了。
  • 您不理解准备好的语句,或者您不明白$user$pass 的来源?它们必须来自某个地方,这与任何 SQL 魔法无关。
  • +1 用于研究准备好的陈述 :-)
  • @deceze 两者。但至少我在理解它们方面越来越好。我看到了这个例子并且非常困惑,因为作者没有说明 $user 和 $pass 的来源。我当然不是要抨击作者,因为他在顶部说这篇文章是为那些已经了解 PHP 和 SQL 的人准备的。

标签: php mysql sql mysqli


【解决方案1】:

那是因为他们不是。这可能只是如何使用脚本的示例。您必须自己定义 $user 和 $pass 变量,例如从某种 $_POST 变量。

bind_param 函数处理参数。您必须在查询中添加相同数量的参数,因为您将问号放入其中。 MySQLi 核心中的解析器可以安全地将参数添加到查询中。

【讨论】:

  • 感谢您提供的信息。我很高兴我的假设在一定程度上是正确的,因为所提供的代码不仅可以独立运行,否则我会感到非常困惑。
【解决方案2】:

它们正在按顺序匹配。字符串构建中的相同逻辑(“{0} 大于 {1}”、“5”、“3”)变为 5 大于 3。所以带参数

$stmt = mysqli_prepare($link, "INSERT INTO CountryLanguage VALUES (?, ?, ?, ?)");
mysqli_stmt_bind_param($stmt, 'sssd', $code, $language, $official, $percent);

它们都是有序的并与列匹配。

【讨论】:

    【解决方案3】:

    如果原始脚本编写者启用了 register_globals,例如在以前的 PHP 版本中,用户和密码是从表单中传入的,方法与 $_POST['user'] 和 $_POST['pass'] 相同。我提议您现在可以更换它们并继续前进。

    【讨论】:

      猜你喜欢
      • 2016-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-01
      相关资源
      最近更新 更多