Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PHP从变量中选择_Php_Html_Mysql - Fatal编程技术网

使用PHP从变量中选择

使用PHP从变量中选择,php,html,mysql,Php,Html,Mysql,我想从数据库中选择一个值,该值包含从$\u get获取的变量,但它不显示任何结果。有人能帮我找出我的代码有什么问题吗 <?php $varPage = $_GET['subject']; $servername = "localhost"; $username = "bayansh_user"; $password = "u)nHf,Accmo)"; $dbname = "bayansh_bmc"; $conn = new mysqli($servername, $username, $p

我想从数据库中选择一个值,该值包含从
$\u 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))

?>
使用此SQL字符串的

"SELECT `date` FROM `editor` WHERE subject = '.$varPage.'"
看起来您没有正确合并连接运算符(
)。正如aynber所评论的,这些将被解释为文字点字符

理想情况下,您可以使用一个准备好的语句并在执行之前绑定变量,但是如果要使用双引号将变量包含在字符串中,则不需要点

"SELECT `date` FROM `editor` WHERE subject = '$varPage'"
只有在关闭字符串时才需要它们,如下所示:

"SELECT `date` FROM `editor` WHERE subject = '" . $varPage . "'"

您应该注意代码中的一些问题…
首先,回答实际问题(与字符串连接有关):

正如您可能在此处突出显示的语法上看到的,并且应该能够在任何像样的IDE或代码编辑器中看到,
符号实际上是字符串的一部分。
当您使用双引号字符串时,您可以添加变量而不使用
,或者通过结束字符串、添加点、变量然后是另一个点,然后再次启动字符串(如果需要更多内容…)将其浓缩,如下所示:

调试这类东西最简单的方法是将查询字符串存储在它自己的字符串中,然后在发现有问题时将其回显出来,在这种情况下,您可能会很快发现问题。或者在
mysqli\u查询
调用的末尾添加
或die(mysqli\u error())

$result = mysqli_query($conn, "query query...") or die(mysqli_error());
现在,这不是代码的最大问题

您使用的是
mysqli
API,这是一件好事,但是您使用的
mysqli\u query
函数带有一个无转义get参数作为查询的一部分,这是非常糟糕的,因为它让您可以进行
SQL注入
(如果您希望保持数据库的安全,这是非常糟糕的)

现在,
mysqli
api有一个很好的方法来阻止这种情况的发生,叫做
prepared statements

Prepared语句负责转义数据,因此很难通过它注入错误代码(它们不会让您从所有错误中解脱出来,但这是迈向更安全代码的良好第一步)。
对于准备好的语句,您的查询如下所示:

$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程序风格,所以我建议检查,而不是使用我的代码。

对于这种sql命令,您不需要字符串连接,应该满足适当的语法要求

"SELECT `date` FROM `editor` WHERE subject = '$varPage'";  

$varPage
整数或字符串的值是多少?非常正确。您的代码容易受到SQL注入的攻击,这是非常糟糕的。从使用准备好的语句开始!从查询字符串中提取句点应该会有所帮助。只有当您从带引号的字符串中跳出时,才需要它们,而不是当您在其中时。否则,mysql会将其视为
where subject='.1.
当我们发表评论以澄清某些事情时,他们要么离开,要么等待一个神奇的答案时,你一定会喜欢它。@aynber到处都有一个糟糕的教程。我试过了,但它给了我空白值(NULL)我想说的是,主题的值是阿拉伯字符,它会正常还是不会……这是否会导致问题,取决于数据库和PHP连接中的编码设置。你可以查看关于这方面的更深入的指导。
$result = mysqli_query($conn, "query query...") or die(mysqli_error());
$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);
"SELECT `date` FROM `editor` WHERE subject = '$varPage'";