使用PHP从Variable中选择

时间:2016-11-30 17:41:45

标签: php html mysql

我想从数据库中选择一个来自$_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>

我的代码有什么问题吗?

2 个答案:

答案 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而不是使用我的代码。