向外部php发送变量的最佳方法

时间:2018-08-26 03:19:02

标签: php html mysql

我想知道是否有人可以引导我走上正确的道路,因为我尝试过的每一种方法都失败了或真的破坏了我的代码。为简单起见,我在页面上创建了一个动态创建的选择框,其中填充了来自mySQL数据库的人员名称,其元素ID为“插入”。该页面还包含php查询

如果我在其中对名称进行硬编码,但我想在选择框中将其作为变量传递,则对数据库的查询有效。我似乎无法获取它来发布变量并返回ID。 这是我的查询

<?php

  function getElementById($id) {
      $xpath = new DOMXPath(NEW domDocument);
      return $xpath - > query("//*[@id='$id']") - > item(0);
  }

  $insertName = getElementById('insert');
  printf($insertName);
  $con = mysqli_connect("localhost", "root", "", "karaoke");

  // Check connection
  if (mysqli_connect_errno()) {
      echo "Failed to connect to MySQL: ".mysqli_connect_error();
  }

  $sql = "Select id FROM queue where singer = '$insertName'";
  $result = mysqli_query($con, $sql) or die("Bad SQL: $sql");

  while ($row = mysqli_fetch_assoc($result)) {
      $insertAt = ("{$row['id']}");
      printf($insertName);
      printf($insertAt);
  };

?>

将变量发送到脚本然后返回答案的最佳方法是什么。

谢谢

1 个答案:

答案 0 :(得分:1)

您可以使用POST or GET form methods来将数据从HTML表单发送到PHP脚本。在form元素中,您将需要像这样<form action = 'your_php_file.php' method = 'GET or POST'>来将操作设置为PHP脚本。这意味着提交表单后,您可以从此PHP文件中获取数据。然后,在您的PHP中,您将要对POSTGET使用global variable(取决于您使用form方法的方式)来从选择框中获取值。使用此方法意味着您可以替换GetById函数,并使用超全局变量将表单中的值分配给$insertName变量。

代码中的另一个问题是您在SQL查询中使用了PHP变量。这意味着您的代码可以进行SQL注入,这可能会导致出现问题,例如人们获取所有数据库信息(这对于存储加密/散列密码差的密码,甚至以纯文本格式存储的数据库都是不利的),甚至导致您的数据库被删除。为避免这种情况,您应该使用准备好的语句和参数,从而首先发送不带变量的语句,然后再绑定变量。

另外,请查看上面有关POSTGET的链接,以及有关PHP全局变量的链接,这些变量将使您能够从HTML表单中获取数据。另外,这里有一些链接解释了准备好的语句和参数,以便您可以编写更安全的PHP代码:

Mysqli prepare statement用于准备语句。稍后将变量绑定到查询时,使用问号作为占位符。

Mysqli Bind Param用于在准备好语句后将变量添加到SQL语句中,以防止SQL注入。

仅此而已,但是请务必提出任何问题,我会尽力回答所有问题。

编辑

添加的代码-希望可以演示您的操作,可能需要进行一些小的更改。可能需要一些额外的代码才能与您拥有的任何其他代码相适应,但这应该证明POST的原理以及带有参数的预准备语句。用OOP编写,而不是用程序编写,因为我觉得它更干净,更容易(个人意见)。如果在集成时遇到任何问题,请务必告诉我任何错误或问题/其他问题。我对PHP也很陌生。

<?php

  $insertName = $_POST['insert']; // Get the value of the select box which will need to have the attribute 'name = "insert"' by POST
  printf($insertName);
  $con = new mysqli("localhost", "root", "", "karaoke");

  // Check connection
  if (mysqli_connect_errno()) {
      echo "Failed to connect to MySQL: ".mysqli_connect_error();
  }

  $sql = "Select id FROM queue where singer = ?";
  $stmt = $con->prepare($sql);
  $stmt->bind_param("s", $insertName); //Binds the string insertName to the question mark in the query
  $stmt->execute();

  while ($row = $stmt->fetch_assoc()) { // Left as was because syntax is different from PDO which I use. Therefore, I am assuming this part is correct.
      $insertAt = ("{$row['id']}");
      printf($insertName);
      printf($insertAt);
  };

?>