如何使用通过HTML表单发送的变量显示mysql中的某些行

时间:2015-08-11 13:04:37

标签: php html mysql mysqli

我正在尝试使用AND条件和用户可搜索的HTML表单从数据库中获取满足条件的数据,该表单将数据发送到搜索。

代码:

<?php
$conn = new mysqli('localhost', 'user', 'pass', 'db');
if ($conn->connect_error) die($conn->connect_error);
$conn->set_charset("utf8");

if (isset($_POST['Kohderyhmä']) &&
isset($_POST['Näytön aste']) &&
isset($_POST['Vaikutusten vahvuus']) &&
isset($_POST['Käyttökelpoisuus']) &&
isset($_POST['text']))
{
$Kohderyhmä = get_post($conn, 'Kohderyhmä');
$Näytön_aste = get_post($conn, 'Näytön aste');
$Vaikutusten_vahvuus = get_post($conn, 'Vaikutusten vahvuus');
$Käyttökelpoisuus = get_post($conn, 'Käyttökelpoisuus');
$text = get_post($conn, 'text');


    $query = "SELECT * FROM `tietokanta`
        WHERE Kohderyhmä='$Kohderyhmä' AND `Näytön aste`='$Näytön_aste' AND `Vaikutusten vahvuus`='$Vaikutusten_vahvuus' AND `Käyttökelpoisuus: luokka`='$Käyttökelpoisuus'";
         }

  $results = $conn->query($query);
if (!$results) die ("Database access failed: " . $conn->error);

$rows = $results->num_rows;
for ($j = 0 ; $j < $rows ; ++$j)
{
$results->data_seek($j);
$row = $results->fetch_array(MYSQLI_ASSOC);

echo '<h3>' . $row['Nimi'] . '</h3><br />';
echo ''  . $row['Kokonaisarvio'] .   '<br />';
echo ''  . $row['Kuvaus'] .  '<br /><br />';

}
?>

<form action="<?php $_SERVER['PHP_SELF']; ?>" method="POST">

<b>Kohderyhmä</b><br />
<select name="Kohderyhmä" style="width: 150px;">
<option value="Kaikki">Kaikki</option>
<option value="Pikkulapset">Pikkulapset</option>
<option value="Alle kouluikäiset">Alle kouluikäiset</option>
<option value="Alakouluikäiset">Alakouluikäiset</option>
<option value="Nuoret">Nuoret</option>
<option value="Perheet">Perheet</option>
<option value="Vanhemmat">Vanhemmat</option>
<option value="Työntekijät">Työntekijät</option>
</select>
<br />

<b>Näytön aste</b>
<select name="Näytön aste" style="width: 150px;">
<option value="Kaikki">Kaikki</option>
<option value="Vahva">Vahva</option>
<option value="Kohtalainen">Kohtalainen</option>
<option value="Heikko">Heikko</option>
<option value="Ei riittävää näyttöä">Ei riittävää näyttöä</option>
<option value="Ei arvioitu">Ei arvioitu</option>
</select>
<br />

<b>Vaikutusten vahvuus</b>
<select name="Vaikutusten vahvuus" style="width: 150px;">
  <option value="Kaikki">Kaikki</option>
  <option value="Vahva">Vahva</option>
  <option value="Kohtalainen">Kohtalainen</option>
  <option value="Heikko">Heikko</option>
  <option value="Ei vaikutusta">Ei vaikutusta</option>
  <option value="Ei arvioitu">Ei arvioitu</option>
</select>
<br />

<b>Käyttökelpoisuus</b>
<select name="Käyttökelpoisuus" style="width: 150px;">
  <option value="Kaikki">Kaikki</option>
  <option value="Vahva">Vahva</option>
  <option value="Kohtalainen">Kohtalainen</option>
  <option value="Heikko">Heikko</option>
  <option value="Ei käyttökelpoinen">Ei käyttökelpoinen</option>
  <option value="Ei arvioitu">Ei arvioitu</option>
</select>
<br />
<br />
&nbsp;

Haku:        <input type="text" name="text" />
    &nbsp; &nbsp;
<input type="submit" value="Hae" />
    </form>

我之前没有使用PHP来联系数据库,所以PHP代码非常混乱。 我不了解PHP的基础知识,我之前没有使用变量或对象或任何复杂的东西。

HTML表单: 变量1 变量2 variable3 variable4 variable5 ---&GT; PHP脚本: 从db中选择* 其中variable1和variable2以及variable3和variable4 ---&GT; 显示符合条件的结果

当前代码会在error_log中导致此错误消息: PHP警告:mysqli :: query():第23行/home/user/public_html/folder/script.php中的空查询

我已经尝试了15种不同的变量变量和sql查询,但没有任何工作..

2 个答案:

答案 0 :(得分:0)

如果我们缩短您可以清楚看到的if (isset($_POST ...内容。这条指令

$results = $conn->query($query);
无论isset是否返回true,

总是被执行。

if (isset($_POST['Kohderyhmä']) &&
 ...)
{
  $Kohderyhmä = get_post($conn, 'Kohderyhmä');
  ...
  $query = "SELECT * FROM `tietokanta`...."
}

$results = $conn->query($query);

因此,如果只有一个字段没有正确填写,则错误始终相同:
PHP Warning: mysqli::query(): Empty query in ...
 这使得很难确定故障的真正来源。

将大括号}放在数据库逻辑后面。

if (isset($_POST['Kohderyhmä']) &&
 ...)
{
  $Kohderyhmä = get_post($conn, 'Kohderyhmä');
  ...
  $query = "SELECT * FROM `tietokanta`...."
  $results = $conn->query($query);
  if (!$results) die ("Database access failed: " . $conn->error);
  $rows = $results->num_rows;
  for ($j = 0 ; $j < $rows ; ++$j)
   {
     $results->data_seek($j);
     $row = $results->fetch_array(MYSQLI_ASSOC);
     ....
   } 
}
?>

创建一个简短的测试程序来仅测试数据库。在查询中仅设置非常必要的数据字段

<强> test.php的

<?php
$conn = new mysqli('localhost', 'user', 'pass', 'db');
if ($conn->connect_error) die($conn->connect_error);
$conn->set_charset("utf8");

$Kohderyhmä = "KohderyTest"; // replace with really existing values

$query = "SELECT * FROM `tietokanta` WHERE Kohderyhmä='".$Kohderyhmä."' ";
$results = $conn->query($query);
if (!$results) die ("Database access failed: " . $conn->error);

  while ($row = $results->fetch_assoc()) {
    echo "<h3>" . $row['Nimi'] . "</h3><br />";
    echo $row['Kohderyhmä'] ."<br /><br />";
  }
$results->free();
?>

添加硬编码变量$Näytön_aste = "reallyExistingValue";,为数据字段添加查询数据字段,并观察它何时开始断断续续。

此外,我们无法看到您的功能get_post()

如果你的意思是Wordpress函数get_post(),那么你对函数的调用是错误的。

  

我可以想象来自get_post()函数的失败   并且你总是假的或空的值分配。

$Kohderyhmä = get_post($conn, 'Kohderyhmä');

直接指定。

$post = $_POST;
if (isset($post['Kohderyhmä']) &&
...)
{
$Kohderyhmä = $post['Kohderyhmä'];
...

此外,您还在查询中使用<form>中的所有选择字段。

4选择8,6,6,6选项意味着

8x6x6x6 == 1728

1728种可能性你确定你有一个所有值匹配的数据线。

WHERE Ko...='$Ko...' AND `Näy...`='$Näy...' AND `Vai...`='$Vai...' AND `Käy...`='$Käy...'";

WHERE所有四个数据字段必须匹配才能获得结果!!!!!!!!!!!!!

您必须找到同时存在所有四个值的组合。

更新

  

OP新问题:
  如果您想要空或某些命名值停止搜索中的值   数据库中。

     

要求在数据库中找到每个变量   找不到,因为我无法设置变量并且没有值   为&#34; Kaikki&#34;在数据库中,单词&#34; Kaikki&#34;意味着所有选择   在HTML表单中的那个选项之下,为此我需要一些PHP

这是新的test.php

  • 1)不要$post['Näytön aste'];在表格中名称为
    <select name="Näytön aste" style="...">
    这将由submit转换为
    $post['Näytön_aste'];查看下划线_
    必须使用名称中包含空格的所有select name来完成此操作。
  • 2)这就是为什么你没有得到所有$ _POST [....]值的原因! 好吗?
  • 3)替换你的表格
    <form action="<?php $_SERVER['PHP_SELF']; ?>" method="POST">

    <form action="testNew.php" method="POST">

testNew.php

<?php
$conn = new mysqli('localhost', 'user', 'pass', 'db');
if ($conn->connect_error) die($conn->connect_error);
$conn->set_charset("utf8");
$post = $_POST;
if (isset($post['Kohderyhmä']) &&
    isset($post['Näytön_aste']) &&
    isset($post['Vaikutusten_vahvuus']) &&
    isset($post['Käyttökelpoisuus']))
 {
  $Kohderyhmä = $post['Kohderyhmä'];
  $Näytön_aste = $post['Näytön_aste'];
  $Vaikutusten_vahvuus = $post['Vaikutusten_vahvuus'];
  $Käyttökelpoisuus = $post['Käyttökelpoisuus'];
 } else { die ("No valid values"); }
    $count = 0;
    $and   = "";
    $query = "";

    if (!empty($Kohderyhmä) && $Kohderyhmä !="Kaikki" ) {
      if ($count > 0) { $and   = " AND ";  }
      $count++;
      $query = $query.$and."`Kohderyhmä`= '".$Kohderyhmä."'";
    }
    if (!empty($Näytön_aste) && $Näytön_aste !="Kaikki" ) {
      if ($count > 0) { $and   = " AND ";  }
      $count++;
      $query = $query.$and."`Näytön aste`= '".$Näytön_aste."'";
    }
    if (!empty($Vaikutusten_vahvuus) && $Vaikutusten_vahvuus !="Kaikki" ) {
      if ($count > 0) { $and   = " AND ";  }
      $count++;
      $query = $query.$and."`Vaikutusten vahvuus`= '".$Vaikutusten_vahvuus."'";
    }
    if (!empty($Käyttökelpoisuus) && $Käyttökelpoisuus !="Kaikki" ) {
      if ($count > 0) { $and   = " AND ";  }
      $count++;
      $query = $query.$and."`Käyttökelpoisuus: luokka`= '".$Käyttökelpoisuus."'";
    }
    if ($count > 0) {
        $query = "SELECT * FROM `tietokanta` WHERE ".$query;
        } else {
        $query = "SELECT * FROM `tietokanta`";    
        } 
    echo $query;

if ($results = $conn->query($query)) {
while ($row = $results->fetch_assoc()) {
    echo "<h3>" . $row['Nimi'] . "</h3><br />";
    echo $row['Kohderyhmä'] ."<br /><br />";
  }
} else {
  echo "with your choices no records were found";
}
$results->free();
?>

答案 1 :(得分:-1)

$query = "SELECT * FROM `tietokanta`
    WHERE Kohderyhmä='{$Kohderyhmä}' AND `Näytön aste`='{$Näytön_aste}' AND `Vaikutusten vahvuus`='{$Vaikutusten_vahvuus}' AND `Käyttökelpoisuus: luokka`='{$Käyttökelpoisuus}'";

用此替换您的查询,然后尝试。