搜索功能不适用于我的PHP应用程序。我一直收到语法错误

时间:2015-09-16 17:58:57

标签: php sql-server pdo

尝试使搜索功能正常工作我不断得到语法错误,不确定我是否正确地开始使用。我有几列id,名称,状态,lanId和注释该表称为请求。只需要一些帮助就可以搞清楚。我不认为搜索这个词在我那里是正确的。我只是不明白如何为我的应用程序创建搜索功能。

--master

好的,所以我稍微改了一下页面显示但现在我得到一个errorsqlsrv_fetch_array()期望参数1是资源,给定空值

  <html>
    <head>
    </head>
    <body>
    <form name="frmSearch" method="post" action="search.php">
      <table width="599" border="1">
        <tr>
          <th>Keyword
          <input name="var1" type="text" id="var1">
          <input type="submit" value="Search"></th>
        </tr>
      </table>
    </form>
    <?php



    $serverName = "xx.xx.xxx.xxx";
    // Connect to MSSQL via PDO
    try {
    $db= new PDO( "sqlsrv:server=$serverName ; Database=systems_requests", "xxx", "xxx");
    $db->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
    }
    catch(Exception $e)
    { 
    die( print_r( $e->getMessage() ) ); 

    $var1 = str_replace(array('%','_'),'',$_POST['var1']);
    if (!$var1)
    {
        exit('Invalid form value: '.$var1);
    }


    $query = "SELECT * FROM requests WHERE status='Received' LIKE :search";
    $stmt = $db->prepare($query);
    $stmt->bindValue(':search', '%' . $var1 . '%', PDO::PARAM_INT);
    $stmt->execute();

    /* Fetch all of the remaining rows in the result set 
    print("Fetch all of the remaining rows in the result set:\n");*/


     $result = $stmt->fetchAll();

    foreach( $result as $row ) {
        echo $row["id"];
        echo $row["status"];
        echo $row["name"];
        echo $row["lanId"];
      echo $row["comments"];
    }




    ?>

    </body>
    </html>

3 个答案:

答案 0 :(得分:4)

除了在评论和Sean的答案中使用WHERELIKE的方式已经说过的话,我还要补充一下这个答案:

您的catch缺少其右括号

    catch(Exception $e)
    {
    die( print_r( $e->getMessage() ) );
    } 
    ^ added

使用错误报告会触发意外的文件结束警告。

另外,在PDO中,不应该有任何空格

"sqlsrv:server=$serverName ; Database=systems_requests"

可能是一个促成因素;删除它们。

"sqlsrv:server=$serverName;Database=systems_requests"

error reporting添加到文件的顶部,这有助于查找错误。

<?php 
error_reporting(E_ALL);
ini_set('display_errors', 1);

// rest of your code

旁注:只应在暂存时进行显示错误,而不是生产。

参考文献:

您的查询需要ANDOR以及该列,具体取决于搜索条件。

但是,我不确定您使用PDO::PARAM_INT,如果您的搜索是字符串,则会失败。

  • 您也无法查询。

阅读手册:

手册中的示例:

$sql = "SELECT FirstName, LastName FROM SomeTable";
$stmt = sqlsrv_query( $conn, $sql );
if( $stmt === false) {
    die( print_r( sqlsrv_errors(), true) );
}

while( $row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC) ) {
      echo $row['LastName'].", ".$row['FirstName']."<br />";
}

在你的情况下:

$query  = "select * from requests where comments like '%" . $var1 . "%'";

$stmt = sqlsrv_query( $db, $query );

您还需要为POST数组使用条件语句。

I.e。:

if(!empty($_POST['var1'])){
  $var1 = $_POST['var1'];
}

<强>重写:

<?php
require_once("../includes/db_connect.php");

if(!empty($_POST['var1'])){
  $var1 = $_POST['var1'];
}

else{ echo "It is empty."; exit; }

$query  = "select * from requests where comments like '%".$var1."%'";

$stmt = sqlsrv_query( $db, $query );

if( $stmt === false)
{
     echo "Error in query preparation/execution.\n";
     die( print_r( sqlsrv_errors(), true));
}


  while( $row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC))
{
    echo 'Id: '.$row['id'];
    echo '<br/> name: '.$row['name'];
    echo '<br/> lanId: '.$row['lanId'];
    echo '<br/> comments: '.$row['comments'];

}


?>

答案 1 :(得分:0)

你的选择不应该更像:

$query = "SELECT * FROM requests WHERE status='Received' and [columnName] LIKE ?";
$stmt = $db->prepare($query);
$stmt->bindValue(?, '%' . $var1 . '%', PDO::PARAM_INT);

如果没有这个,查询就无法知道您要搜索的是哪个列。

答案 2 :(得分:0)

出于某种原因,有几个人很难在这里搞清楚这个问题。这将是现在在语法上正确的查询。我不知道您要在搜索中包含哪个列,但是使用您的实际列名更改SomeColumn,这应该在那里。

 $query = "SELECT * FROM requests WHERE status='Received' AND SomeColumn LIKE :search";