我想从数据库中选择一个来自$_GET
的变量的值,但它没有显示任何结果。任何人都可以帮我找到我的代码有什么问题吗?
<?php
$varPage = $_GET['subject'];
$servername = "localhost";
$username = "bayansh_user";
$password = "u)nHf,Accmo)";
$dbname = "bayansh_bmc";
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$result = mysqli_query($conn,"SELECT `date` FROM `editor` WHERE subject = '.$varPage.'");
while($row = mysqli_fetch_array($result))
?>
我把它写到p:
<p style="font-family:B Zar; direction:rtl; font-size:165%;"> <?= $row['date'] ?> </p>
我的代码有什么问题吗?
答案 0 :(得分:0)
使用此SQL字符串
"SELECT `date` FROM `editor` WHERE subject = '.$varPage.'"
您似乎错误地合并了连接运算符(.
)。正如aynber评论的那样,这些将被解释为文字点字符。
理想情况下,您可以在执行前使用预准备语句并绑定变量,但如果您要使用双引号将变量包含在字符串中,则不需要这些点。
"SELECT `date` FROM `editor` WHERE subject = '$varPage'"
如果您关闭了字符串,则只需要它们,如下所示:
"SELECT `date` FROM `editor` WHERE subject = '" . $varPage . "'"
答案 1 :(得分:0)
您的代码应该注意一些问题...
首先,回答实际问题(与字符串连接有关):
$result = mysqli_query($conn,"SELECT `date` FROM `editor` WHERE subject = '.$varPage.'");
正如您可以在SO上看到的语法高亮显示,应该能够在任何体面的 IDE或代码编辑器中看到'
和.
符号实际上是字符串的一部分
当你使用双引号字符串时,可以添加不带.
的变量,或者只是通过结束字符串,添加点,变量然后另一个点然后再次启动字符串来连接它(如果你需要更多它... )像这样:
$query = "SELECT `date` FROM `editor` WHERE subject = '" . $varPage . "'";
// or
$query = "SELECT `date` FROM `editor` WHERE subject = '$varPage'";
调试此类东西的最简单方法是将查询字符串存储在自己的字符串中,然后在发现错误时将其回显出来,在这种情况下,您希望能够非常快地注意到这个问题。或者在or die(mysqli_error())
来电结束时添加mysqli_query
:
$result = mysqli_query($conn, "query query...") or die(mysqli_error());
现在,这不是代码中最大的问题!
您正在使用mysqli
API,这是一件好事,但是您使用mysqli_query
函数将无转义的get参数作为查询的一部分,这非常糟糕因为它会让你为SQL injections
打开(如果您希望保持数据库的安全,这是非常糟糕的。)
现在,mysqli
api有一件很棒的事情可以阻止prepared statements
发生这种情况。
准备好的语句负责转义数据,以便更难以通过它注入错误的代码(它们不能避免出现所有不良内容,但它是更安全代码的第一步)。
您的查询与预编译语句类似:
$stmt = mysqli_prepare($conn, "SELECT date FROM editor WHERE subject=?");
// see the ? - thats a placeholder that we will fill on the next row.
mysqli_stmt_bind_param($stmt, "s", $varPage); // if varpage is a string, i for integer.
mysqli_stmt_bind_result($stmt, $date);
while (mysqli_stmt_fetch($stmt)) {
echo $date;
// $date will change for each loop and contain the date from the row in database.
}
mysqli_stmt_close($stmt);
现在,我不习惯使用mysqli及其程序风格的php,所以我建议检查docs而不是使用我的代码。