【问题标题】:Database connectivity using JSON使用 JSON 的数据库连接
【发布时间】:2018-06-01 07:01:11
【问题描述】:

我的php代码,

<?php
 header("Content-Type: application/json; charset=UTF-8");
 $obj = json_decode($_GET["x"], false);
 $serverName = "AE58RETY245YU"; 
 $connectionInfo = array( "Database"=>"Test", "UID"=>"bala", 
 "PWD"=>"bala");
 $conn = sqlsrv_connect( $serverName, $connectionInfo);
 if( $conn ) {
 echo "Connection established.<br />";
 }else{
 echo "Connection could not be established.<br />";
 die( print_r( sqlsrv_errors(), true));
 }
 $outp=array();
 $sql = "SELECT Point FROM ".$obj->table."LIMIT".$obj->limit;
 $stmt = sqlsrv_query( $conn, $sql );
 while( $row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC) ) {
 $outp=$row['Point'];
 }
 echo json_encode($outp);
?>

我的html代码,

<!DOCTYPE html>
<html>
<body>
<h2>Get data as JSON from a PHP file on the server.</h2>
<p>The JSON received from the PHP file:</p>
<p id="demo"></p>
<script>
var obj, dbParam, xmlhttp;
obj = { "table":"PointEvent", "limit":10 }; 
dbParam = JSON.stringify(obj);
xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
    document.getElementById("demo").innerHTML = this.responseText;
}
};
 xmlhttp.open("GET", "testsql.php?x=" + dbParam, true);
 xmlhttp.send();

</script>

</body>
</html>

你好,

以上是我的 PHP 和 HTML 代码,我尝试使用 Json(编码和解码方法)连接 sql 数据库并尝试打印单列,但得到的错误是

'警告:sqlsrv_fetch_array() 期望参数 1 是资源,布尔值在'中给出。

谁能帮我解决这个问题。

提前致谢。

【问题讨论】:

    标签: php sql json sql-server


    【解决方案1】:

    我在您的查询“添加空间”中发现了连接问题,否则查询看起来类似于“SELECT Point FROM mytableLIMIT1

    来自

    $sql = "SELECT Point FROM ".$obj->table."LIMIT".$obj->limit;
    

    $sql = "SELECT Point FROM ".$obj->table." LIMIT ".$obj->limit;
    

    也可以通过在while之前添加一行来正确处理异常

    if( $stmt === false ) { /*!Handle exception here*/ }
    

    看来您是编程新手。在使用数据库时,永远不要相信像 $_GET["x"] 这样的原始用户输入。进行适当的清理,否则最终会导致 sql 注入。

    通过以下链接了解更多信息

    What are the best PHP input sanitizing functions?

    How can I prevent SQL injection in PHP?

    【讨论】:

    • 我在查询中使用了空格,但我没有得到准确的输出。我的输出就像 Array ( [0] => Array ( [0] => 42000 [SQLSTATE] => 42000 [1] => 102 [code] => 102 [2] => [Microsoft][ODBC Driver 11 for SQL Server][SQL Server]'10' 附近的语法不正确。[消息] => [Microsoft][ODBC Driver 11 for SQL Server][SQL Server]'10' 附近的语法不正确。))
    • 我认为这可能是转义内容的问题。你在查询变量内容中使用了$,可能是表名吗?
    • 对不起,我没听明白。你能把查询写在这里吗,如何在查询变量内容中使用$,可能是表名....pleaseeee
    • 变量 $obj->table 中是否包含字符串“$”?例如。 “我的数据库$mytablename”
    • 例如。 $a = "堆栈"; $b = "溢出"; echo "$a$b";//堆栈溢出。 echo "$a\$b";//stack$b
    【解决方案2】:

    带有$stmt = sqlsrv_query($conn, $sql); 语句的行可能会导致您的问题。我认为$sql 没有很好地形成。我不确定 MS SQL Server 有 'LIMIT' 关键字,所以先试试这个:$sql = "SELECT Point FROM ".$obj-&gt;table;

    在使用sqlsrv_fetch_array()之前,您还必须始终检查sqlsrv_query()的结果:

    $sql = "SELECT Point FROM ".$obj->table;
    $stmt = sqlsrv_query($conn, $sql);
    if( $stmt === false ) {
        echo "Error (sqlsrv_query): ".print_r(sqlsrv_errors(), true);
        exit;
    }
    ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-29
      • 2020-06-28
      相关资源
      最近更新 更多