我对此很陌生,我知道我可能以错误的方式做这件事,但我一整天都在试图找出答案。我意识到编写自己的真实项目与仅仅在线练习小语法代码之间存在很大差异。因此,我缺乏如何将不同变量/范围合并/传递在一起的经验。对我来说,理解如何将一切融入到更大的图景中是一个完全不同的故事。提前致谢。
我想做的是使函数“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>
最佳答案
伙计,我不确定我是否可以在一个答案中涵盖整个 PHP 编码标准,但我至少会尝试指导您。
首先,您需要了解类和面向对象编程。该主题本身可以是一本书,但您应该研究的是自动加载,它基本上允许您将函数代码放在不同的文件中,并让服务器在您调用这些文件之一中使用的函数时包含这些文件。这样,您将能够拆分负责数据库连接和执行数据操作(获取/更新/删除)的代码。
其次,放弃mysqli并转移到PDO(或者当您发现Composer是什么时更好地转移到DBAL)。我知道互联网上有很多基于 mysqli 的示例,但这种方法已经过时了,不会再回来了。
接下来,使用准备好的语句 - 这是一个安全问题(阅读有关 SQL 注入(inject)的内容)。永远不要像这样将外部变量放入查询中:
"SELECT * FROM ships WHERE Name=" . "'" . $shipname . "'";
任何有恶意的人都可以在那里放置字符串,该字符串将修改您的查询以执行他想要的任何操作,例如。完全删除您的数据库。在 PDO 中使用准备好的语句,您的查询将如下所示:
$stmt = $this->pdo->prepare("SELECT * FROM ships WHERE Name = :ship_name");
$stmt->bindValue(':ship_name', $shipname);
现在到你的结构 - 你应该有DB类
只负责数据库连接和Ships类
,你可以在其中负责你的函数,例如。用于获取数据。您可以将数据库连接作为参数传递(注入(inject))到包含 selectYacht
函数的类。
在此处查看实现的详细信息:Singleton alternative for PHP PDO
对于
'Returning data in a different place from where it's being called'
如果我理解正确的话,您希望有一些字段来输入船舶名称和按钮以在单击后显示其详细信息。您这里有 2 个选择:
标准表单 - 您只需创建标准 html 表单并通过单击按钮将其重定向到自身(或其他页面)来提交。在您想要显示结果的文件中,您只需使用函数
selectYacht
从 POST 获取船舶名称并将其传递给函数selectYacht
,然后打印其结果(逐个字段在你需要它们的地方)AJAX 表单 - 如果您喜欢在不重新加载原始页面的情况下执行此操作 - 通过 AJAX 将表示船舶名称的字段值发送到您使用 selectYacht 函数并使用 Java 脚本更新页面的其他页面
关于php - 将函数结果传递到sql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45528294/