【问题标题】:SQL query doesn't execute on MSSQLSQL 查询不在 MSSQL 上执行
【发布时间】:2016-08-29 10:56:34
【问题描述】:

脚本从 URL 接收变量:

if(isset($_GET['string'])){
    $string = $_GET['string'];
}

然后我在sql查询中使用这个变量:

$sql = 
"SELECT 
    *
FROM 
    mytable
WHERE
    mytable.column_a = '".$string."'";

问题是这个查询没有执行,我的变量包含特殊字符。示例:

/myscript.php?string=a>xxx<P>yy@"

尝试同时使用 htmlentities()addslashes()。还尝试复制/粘贴变量的 echo - 工作正常。

我该如何解决这个问题?

【问题讨论】:

  • 使用查询参数而不是将值填充到查询字符串中。
  • 我也建议同样的事情,使用查询参数而不是将值放在您的 php 查询字符串中
  • 如果你有特殊字符并且你从URL中获取字符串,你不需要使用解码吗? php.net/manual/en/function.htmlspecialchars-decode.php
  • 要么使用可以为您解决问题的参数,要么编写几页代码来转义每个特殊字符。

标签: php html sql sql-server


【解决方案1】:

请使用参数而不是连接查询部分。这段代码应该可以正常工作:

<?php
header('Content-Type: text/html; charset=utf-8');

$serverName = "SERVER\INSTANCE";
$connectionInfo = array("Database"=>"Test");
$conn = sqlsrv_connect($serverName, $connectionInfo);

if(isset($_GET['string'])){
    $params = array($_GET['string']);
}

if( $conn === false ) {
   echo "Unable to connect.</br>";
   die(print_r(sqlsrv_errors(), true));
}

$tsql = 
"SELECT  *
FROM mytable
WHERE column_a = ?";

$stmt = sqlsrv_query($conn, $tsql, $params);

if( $stmt === false ) {
    echo "Error in executing query.</br>";
    die(print_r(sqlsrv_errors(), true));
}

while ($obj = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_NUMERIC)) {
    echo $obj[0]; 
}

sqlsrv_free_stmt($stmt);
sqlsrv_close($conn);

【讨论】:

    【解决方案2】:

    如果 column_a 是 nvarchar 数据类型,请尝试在字符串引号前包含 N。

    【讨论】:

      【解决方案3】:

      试试这个查询

      首先检查 $string 是否正确,然后尝试,

      $sql = 
      "SELECT 
          *
      FROM 
          mytable
      WHERE
          mytable.column_a = ".$string;
      

      【讨论】:

        【解决方案4】:

        我建议您使用 urlencode — 对您的代码进行 URL 编码,有关更多信息和详细信息,您还可以查看以下链接:

        http://php.net/manual/en/function.urlencode.php

        【讨论】:

          猜你喜欢
          • 2018-03-03
          • 2016-07-11
          • 1970-01-01
          • 2017-09-06
          • 1970-01-01
          • 2015-07-26
          • 1970-01-01
          • 2018-09-30
          • 1970-01-01
          相关资源
          最近更新 更多