将函数结果传递给sqli

时间:2017-08-06 03:34:48

标签: php mysql mysqli

我是新手,我知道我可能会以错误的方式做这件事,但我整天都在努力解决这个问题。我意识到编写一个我自己的真实项目而不仅仅是在线练习小型语法代码之间存在很大差异。所以,我缺乏如何合并/传递不同变量/范围的经验。了解如何将所有内容都放在更大的范围内对我来说是一个完全不同的故事。提前谢谢。

我正在尝试做的是将函数“selectyacht”输出数据放在与调用它的位置不同的位置(在viewship.php中)。输出数据(在viewship.php中)只需要返回某些字段(而不是所有字段),这些结果将分散在整个html页面(而不是表格中)。除此之外,我有这个变量:“$ sqlstatement”(在sqlconn.php中),我试图将其带到函数外部,因为我不想每次都重复连接函数。我尝试了一个全局变量,尽管我不应该这样做,幸好它给了我一个错误,这意味着我必须找到一个更好的方法。

基本上我的斗争是理解我应该如何基于两个因素构建整个事物:

  • 允许输入sqlconn.php中的第二个条件语句 尽可能少地使用不同的“selectyacht”功能 这将在未来发生。
  • 允许sqlconn.php中的连接实例驻留在函数外部,因为它将多次用于不同的函数。
  • 在与viewship.php中调用的地方不同的地方返回数据,因为调用将是按下按钮,而不是显示的结果。

这可能很简单,但它让我望而却步。 附:这些代码中的一部分是来自互联网上其他资源的复制/粘贴,我正在尝试根据自己的需要进行合并。

sqlconn.php

<?php
  $servername = "XXXXXXXX";
  $username = "XXXXXXXX";
  $password = "XXXXXXXX";
  $dbname = "XXXXXXXX";

  // Instantiate the connection object
  $dbconn = new mysqli($servername, $username, $password, $dbname);

  // Check if the connection works or show an error
  if ($dbconn->connect_error) {
      die("Connection failed: " . $dbconn->connect_error);
  }

  // Create a query based on the ship's name
  function selectyacht($shipname) {
    global $sqlstatement;
    $sqlstatement = "SELECT * FROM ships WHERE Name=" . "'" . $shipname . "'";
  }
  // Put the sql statement inside the connection.
  // Additional sql statements will be added in the future somehow from other functions
  $query = $dbconn->query($sqlstatement);

  // Return the data from the ship to be repeated as less as possible for each future function
  if ($query->field_count > 0) {
    while($data = $query->fetch_assoc()) {
          return $data;
      }
  }
  else {
      echo "No data found";
  }

  // Close the connection
  $dbconn->close();
?>

viewship.php

<html>
<body>
  <?php include 'sqlconn.php';?>
  <!-- ship being selected from different buttons -->
  <?php selectyacht("Pelorus");?>
  <br>
  <!-- This is the output result -->
  <?php echo $data["Designer"];?>
  <?php echo $data["Length"];?>
  <?php echo $data["Beam"];?>
  <?php echo $data["Height"];?>
</body>
</html>

1 个答案:

答案 0 :(得分:0)

Mate,我不确定我是否可以在一个答案中涵盖整个PHP编码标准,但我会尝试至少指导你。

首先,您需要了解类和面向对象的编程。主题本身可能是一本书,但您应该研究的是自动加载,它基本上允许您将函数代码放在不同的文件中,并让服务器在您调用其中一个文件中使用的函数时包含这些文件。这样,您就可以拆分负责数据库连接和执行数据操作(获取/更新/删除)的代码。

其次,删除 mysqli 并转移到PDO(当您发现Composer是什么时,甚至更好地转到DBAL)。我知道互联网上充满了基于mysqli的例子,但是这种方法只是在它的出路而且它没有回来。

接下来,使用预准备语句 - 这是一个安全问题(阅读SQL注入)。永远不要将外部变量放入查询中,如下所示:

"SELECT * FROM ships WHERE Name=" . "'" . $shipname . "'";

任何有意图的人都可以放置字符串,它会修改你的查询以做任何他想做的事情,例如。彻底清除你的数据库。在PDO中使用预准备语句,您的查询将如下所示:

$stmt = $this->pdo->prepare("SELECT * FROM ships WHERE Name = :ship_name");
$stmt->bindValue(':ship_name', $shipname);

现在你的结构 - 你应该DB class只负责数据库连接,Ships class负责你的职责,例如。用于获取数据。比将数据库连接传递(注入)作为包含selectYacht函数的类的参数。

在此处查看有关实施方式的详细信息:Singleton alternative for PHP PDO

对于

  

'在与其被称为'

的地方不同的地方返回数据

如果我理解正确,您可以在输入船名和按钮之后输入一些字段以显示其详细信息。这里有2个选项:

  • 标准表单 - 您只需创建标准html表单并通过按钮单击将其重定向到自身(或其他页面)来提交。在您希望显示结果的文件中,您只需使用函数selectYacht从POST获取发货名称并将其传递给函数selectYacht,然后只打印它的结果(在您需要的地方按字段填写)< / p>

  • AJAX表单 - 如果您更喜欢在不重新加载原始页面的情况下执行此操作 - 通过AJAX将表示船名的字段值发送到您使用selectYacht函数并使用Java Script更新页面的其他页面