我想知道是否有人可以引导我走上正确的道路,因为我尝试过的每一种方法都失败了或真的破坏了我的代码。为简单起见,我在页面上创建了一个动态创建的选择框,其中填充了来自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);
};
?>
将变量发送到脚本然后返回答案的最佳方法是什么。
谢谢
答案 0 :(得分:1)
您可以使用POST
or GET
form methods来将数据从HTML表单发送到PHP脚本。在form元素中,您将需要像这样<form action = 'your_php_file.php' method = 'GET or POST'>
来将操作设置为PHP脚本。这意味着提交表单后,您可以从此PHP文件中获取数据。然后,在您的PHP中,您将要对POST
或GET
使用global variable(取决于您使用form方法的方式)来从选择框中获取值。使用此方法意味着您可以替换GetById函数,并使用超全局变量将表单中的值分配给$insertName
变量。
代码中的另一个问题是您在SQL查询中使用了PHP变量。这意味着您的代码可以进行SQL注入,这可能会导致出现问题,例如人们获取所有数据库信息(这对于存储加密/散列密码差的密码,甚至以纯文本格式存储的数据库都是不利的),甚至导致您的数据库被删除。为避免这种情况,您应该使用准备好的语句和参数,从而首先发送不带变量的语句,然后再绑定变量。
另外,请查看上面有关POST
和GET
的链接,以及有关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);
};
?>