使用 JSON 的数据库连接

Posted

技术标签:

【中文标题】使用 JSON 的数据库连接【英文标题】:Database connectivity using 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 是资源,布尔值在'中给出。

谁能帮我解决这个问题。

提前致谢。

【问题讨论】:

【参考方案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;

...

【讨论】:

以上是关于使用 JSON 的数据库连接的主要内容,如果未能解决你的问题,请参考以下文章

使用 Json_Query 连接数组值

Android 使用 AsyncTask 连接 MySql 并以 JSON 或 String 的形式返回数据

当从 MySQL 数据库动态加载元素时,在 PHP 中连接 2 个 JSON 数组

无法使用 Confluent Elasticsearch 接收器连接器将 Kafka 主题数据转换为结构化 JSON

连接 JSON AFnetworking 2.0

.NET Core appsettings.json 获取数据库连接字符串