我可以使用 ajax 选择 mysqli db 行吗?

Posted

技术标签:

【中文标题】我可以使用 ajax 选择 mysqli db 行吗?【英文标题】:Can I select mysqli db rows using ajax? 【发布时间】:2016-12-23 18:01:05 【问题描述】:

我正在 php 中创建一个程序,用户选择一个字母,然后在屏幕上打印所有以该字母开头的名称,这些名称存储在我的 mysql“presta_prova”数据库中。 这是我的代码(php文件):

<!DOCTYPE html>
<html>

<head>
  <style>
    table 
      width: 100%;
      border-collapse: collapse;
    
    table,
    td,
    th 
      border: 1px solid black;
      padding: 5px;
    
    th 
      text-align: left;
    
  </style>
  <script>
    function showUser(str) 
      if (str == "") 
        document.getElementById("txtHint").innerHTML = "";
        return;
       else 
        if (window.XMLHttpRequest) 
          // code for IE7+, Firefox, Chrome, Opera, Safari
          xmlhttp = new XMLHttpRequest();
         else 
          // code for IE6, IE5
          xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
        
        xmlhttp.onreadystatechange = function() 
          if (xmlhttp.readyState == 4 && xmlhttp.status == 200) 
            document.getElementById("txtHint").innerHTML = xmlhttp.responseText;
          
        ;
        xmlhttp.open("GET", "presta_prova.php?q=" + str, true);
        xmlhttp.send();
      
    
  </script>
</head>

<body>
  <form>
    <select name="users" onchange="showUser(this.value)">
      <option value="">Scegliete una lettera:</option>
      <option value="1">A</option>
      <option value="2">B</option>
      <option value="3">C</option>
      <option value="4">D</option>
    </select>
  </form>
  <br>
  <div id="txtHint"><b>Vedi qui i tipi ti marche:</b>
  </div>
  <?php $q=i ntval($_GET[ 'q']); $con=m ysqli_connect( 'localhost', 'root', 'evolvia2016', 'presta_prova'); if (!$con)  die( 'Could not connect: ' . mysqli_error($con));  mysqli_select_db($con, "presta_prova"); $sql="SELECT * FROM presta_prova WHERE marca LIKE '"
  .$q%. "' "; $result=m ysqli_query($con,$sql); echo "<table>
<tr>
<th>Marca</th>
<th>Descrizione</th>
</tr>"; while($row=m ysqli_fetch_array($result))  echo "<tr>"; echo "<td>" . $row[ "marca"] . "</td>"; echo "<td>" . $row[ "descrizione"] . "</td>"; echo "</tr>";  echo "</table>"; mysqli_close($con); ?>
</body>

</html>
但是当我选择一个字母时,这就是我的输出。而不是我的数据库行,这个程序输出表的头部。我的代码做错了吗?也许这种方式不适用于mysqli数据库?谢谢! 这是我的数据库:

【问题讨论】:

忽略会导致语法错误的随机空格,.$q%. 也会导致语法错误。 %,即通配符需要在 SQL 字符串中。 【参考方案1】:

如果目标是用新行填充表,而不是将响应附加到 div 中,那么您可以重组代码并像这样使用 POST。

<?php

    if( $_SERVER['REQUEST_METHOD']=='POST' )
        ob_clean();

        /* Forgot to change this to POST! */
        $q=intval($_POST[ 'q']);

        $con=mysqli_connect( 'localhost', 'root', 'evolvia2016', 'presta_prova');
        if (!$con)die( 'Could not connect: ' . mysqli_error($con));

        mysqli_select_db($con, "presta_prova");
        $sql="SELECT * FROM presta_prova WHERE marca LIKE '".$q."%' ";
        $result=mysqli_query($con,$sql);



        $html=array("<tr><th>Marca</th><th>Descrizione</th></tr>");

        while( $row=mysqli_fetch_array($result) )  
            $html[]="<tr><td>" . $row[ "marca"] . "</td><td>" . $row[ "descrizione"] . "</td></tr>"; 
         

        mysqli_close($con);


        exit( implode(PHP_EOL,$html) );
    

?>


<!DOCTYPE html>
<html>
    <head>
    <title>gotta have a title</title>
      <style>
        table 
          width: 100%;
          border-collapse: collapse;
        
        table,
        td,
        th 
          border: 1px solid black;
          padding: 5px;
        
        th 
          text-align: left;
        
      </style>
      <script>
        function showUser(str) 
          if (str == "") 
            document.getElementById("txtHint").innerHTML = "";
            return;
           else 
            if (window.XMLHttpRequest) 
              // code for IE7+, Firefox, Chrome, Opera, Safari
              xmlhttp = new XMLHttpRequest();
             else 
              // code for IE6, IE5
              xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
            
            xmlhttp.onreadystatechange = function() 
              if (xmlhttp.readyState == 4 && xmlhttp.status == 200) 
                document.getElementById("results").innerHTML = xmlhttp.responseText;
              
            ;
            xmlhttp.open("POST", location.href, true );/*"presta_prova.php"*/
            /* send the content-type header */
            xmlhttp.setRequestHeader('Content-Type','application/x-www-form-urlencoded');

            /* my mistake here, this should be like this rather than object literal. */
            xmlhttp.send( 'q='+str );

          
        
      </script>
    </head>
    <body>
      <form>
        <select name="users" onchange="showUser( this.value )">
          <option value="">Scegliete una lettera:</option>
          <option value="1">A</option>
          <option value="2">B</option>
          <option value="3">C</option>
          <option value="4">D</option>
        </select>
      </form>
      <br>
      <div id="txtHint"><b>Vedi qui i tipi ti marche:</b>
      </div>
      <table id='results'>
        <tr>
            <th>Marca</th>
            <th>Descrizione</th>
        </tr>
        </table>
    </body>
</html>

没有数据库交互但显示选择机制工作的完整工作示例。

<?php
    if( $_SERVER['REQUEST_METHOD']=='POST' )
        ob_clean();

        $q=intval( $_POST[ 'q'] );
        $t=$_POST['text'];

        /* emulated database search and results being generated */
        $html=array('<tr><th>Marca</th><th>Descrizione</th></tr>');
        for( $i=0; $i < 10; $i++ ) $html[]='<tr><td>Marca:'.$i.' q='.$q.'</td><td>Descrizione:'.$i.' text='.$t.'</td></tr>';

        header( 'Content-Type: text/html' );
        exit( implode( PHP_EOL, $html ) );
    
?>
<!DOCTYPE html>
<html>
    <head>
    <title>gotta have a title</title>
      <style>
        table 
          width: 100%;
          border-collapse: collapse;
        
        table,
        td,
        th 
          border: 1px solid black;
          padding: 5px;
        
        th 
          text-align: left;
        
      </style>
      <script>
        function showUser(o) 
          if (o.value == '') 
            document.getElementById("txtHint").innerHTML = "";
            return;
           else 

            xmlhttp = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");
            xmlhttp.onreadystatechange = function() 
              if (xmlhttp.readyState == 4 && xmlhttp.status == 200) 
                document.getElementById("results").innerHTML = xmlhttp.responseText;
              
            ;
            xmlhttp.open( "POST", location.href, true );
            xmlhttp.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
            xmlhttp.send( 'q='+o.value+'&text='+o.options[o.options.selectedIndex].text );
          
        
      </script>
    </head>
    <body>
      <form>
        <select name="users" onchange="showUser( this )">
          <option value="">Scegliete una lettera:</option>

          <?php
            /* Generate each letter of the alphabet as an option */
            for( $i=0; $i<26; $i++ )
                $char=chr( $i + 65 );
                $int=$i+1;
                echo "<option value='$int'>$char";
            
          ?>
        </select>
      </form>
      <br>
      <div id="txtHint"><b>Vedi qui i tipi ti marche:</b>
      </div>
      <table id='results'><!-- results will overwrite the table innerHTML -->
        <tr>
            <th>Marca</th>
            <th>Descrizione</th>
        </tr>
       </table>
    </body>
</html>

【讨论】:

好的,这不是交互式的。我选择了一封信,然后什么也没有发生。我不知道这是否适用于您的电脑。 我必须承认在 ajax 请求中发送参数时犯了一个小错误——我认为咖啡还没有开始起作用。当然,它应该是 q=A 等格式的字符串,而不是对象文字 - 还设置 Content-Type 标头。 也许我应该插入一些脚本让它工作?我的本地主机中没有任何内容。

以上是关于我可以使用 ajax 选择 mysqli db 行吗?的主要内容,如果未能解决你的问题,请参考以下文章

通过ajax调用加载mysqli php数据

如何修复MYSQLi Select DB需要精确的2个参数

使用 mysqli 在同一查询中选择和插入/更新

在 codeigniter 中使用 AJAX 从视图调用控制器函数并从 db 检索行

回显 mysqli 查询

使用 mysqli_query 进行 ajax 表单验证