将PHP连接到MS SQL Server

时间:2014-07-01 13:56:09

标签: php sql-server sqlsrv

<?php
$serverName = "(local)"; //serverName
$connectionInfo = array( "Database"=>"DabaseNew", "UID"=>"sa", "PWD"=>"*****");
$conn = sqlsrv_connect( $serverName, $connectionInfo);
if( $conn==true ) {
    echo "Connection established.<br />";
}else{
    echo "Connection could not be established.<br />";
    die( print_r( sqlsrv_errors(), true));
}
$sql = "SELECT * FROM Dbo.DATABASE COMPANY SERVICES$Employee";
$stmt = sqlsrv_query( $conn, $sql);
if(!$stmt){
    die( print_r( sqlsrv_errors(), true));
}
$rows = sqlsrv_has_rows($stmt);
while($obj = sqlsrv_fetch_object( $stmt)){
    echo $obj->Description.", ".$obj->lName."<br />";
}
?>

我正在尝试使用sqlsrv_connect将php连接到我的sql server。上面的代码在下面给出了一个错误;

输出: 连接已建立。 数组([0] =&gt;数组([0] =&gt; 42000 [SQLSTATE] =&gt; 42000 [1] =&gt; 102 [代码] =&gt; 102 [2] =&gt; [Microsoft] [SQL Server Native Client 11.0] [SQL Server]&#39; SERVICES&#39;附近的语法不正确。[message] =&gt; [Microsoft] [SQL Server Native Client 11.0] [SQL Server]&#39; SERVICES&#39附近的语法不正确;。))

3 个答案:

答案 0 :(得分:1)

如果tablename中有空格,您应该像这样运行查询: $ sql =&#34; SELECT * FROM dbo。[数据库公司服务]&#34 ;; 不确定你要用$ employee做什么,因为php将它视为一个变量并尝试将其填充到那里(我认为这里$ employee为NULL)。

答案 1 :(得分:1)

尝试切换

$sql = "SELECT * FROM Dbo.DATABASE COMPANY SERVICES$Employee";

$sql = 'SELECT * FROM Dbo.[DATABASE COMPANY SERVICES$Employee]';

因为php认为如果你使用双引号,$ Employee是一个变量。 []用于告诉数据库表名是DATABASE COMPANY SERVICES$Employee,否则空格将指示另一个sql命令或变量的开始。

尽量不要在表名中使用空格btw,这样可以避免混淆。

答案 2 :(得分:0)

您需要使用$转义\$字符,因为php会将其视为变量的第一个字符。试试这个:

$sql = "SELECT * FROM Dbo.[DATABASE COMPANY SERVICES\$Employee]";

编辑:

为避免转义,您还可以使用单引号'而不是双引号"。然后PHP不解析字符串中的变量。 (see this question

$sql = 'SELECT * FROM Dbo.[DATABASE COMPANY SERVICES$Employee]';

第二次编辑:

要连接两个字符串,请使用.运算符,如下所示:

$foo = "Hello ";
$bar = $foo."world!"; // gives "Hello world!"

正如您可以在第一个编辑"中引用的答案内阅读双引号中的变量解析变量,而'单引号则不会。你可能的解决方案可能是这样的:

$query = 'SELECT [First Name] AS firstName, [Last Name] AS lastName
            FROM  Dbo.[DATABASE COMPANY SERVICES$Employee]
            WHERE [Employee Number] = 15 OR [E-Mail] = \''.mssql_escape($mail).'\'';

但是你永远不应该直接在你的sql server上发送一个GET参数。任何人都可以渗透你的数据库甚至删除它。因此,您应该添加一个类似this one的转义函数,或者考虑使用另一个像PDO这样的db-library并构建参数化查询。我可以用另一个单引号来转义变量中的单引号:

function mssql_escape($str) {
    return str_replace("'", "''", $str);
}