Подключение PHP к MS SQL Server

<?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 />";
}
?>

Я пытаюсь подключиться к php к моему серверу sql, используя sqlsrv_connect. Приведенный выше код дает мне ошибку ниже;

Вывод: Соединение установлено. Массив ( [0] => Массив ( [0] => 42000 [SQLSTATE] => 42000 [1] => 102 [код] => 102 [2] => [Microsoft][SQL Server Native Client 11.0][SQL Сервер] Неверный синтаксис рядом с «СЛУЖБЫ». [сообщение] => [Microsoft] [SQL Server Native Client 11.0] [SQL Server] Неверный синтаксис рядом с «СЛУЖБЫ». ))


person user3315848    schedule 01.07.2014    source источник
comment
SELECT * FROM Dbo.DATABASE COMPANY SERVICES$Employee Это запрос?   -  person Abdullah    schedule 01.07.2014
comment
Что вы хотите выбрать из какой базы данных и при каких условиях?   -  person Daniel    schedule 01.07.2014
comment
@Abdullah Я хотел бы видеть все столбцы таблицы   -  person user3315848    schedule 01.07.2014
comment
как называется таблица, которую вы запрашиваете?   -  person Daniel    schedule 01.07.2014
comment
@Daniel Я хочу видеть поле «Описание» и поле «Фамилия», поэтому я использую SELECT Description, Last Name FROM Dbo.DATABASE COMPANY SERVICES $Employee, но это все еще не работает   -  person user3315848    schedule 01.07.2014
comment
имя таблицы — Dbo.DATABASE COMPANY SERVICES$Employee   -  person user3315848    schedule 01.07.2014
comment
Вы уверены, что имя вашей таблицы содержит пробелы?   -  person Gudgip    schedule 01.07.2014
comment
Что за имя таблицы   -  person Abdullah    schedule 01.07.2014
comment
Я думаю, вы имели в виду: $sql = 'SELECT * FROM Dbo.[DATABASE COMPANY SERVICES$Employee]'; если имя вашей таблицы DATABASE COMPANY SERVICES$Employee   -  person Gudgip    schedule 01.07.2014
comment
@Gudgip, я пытаюсь, sqlserver позволяет это, но почему кто-то использует такое имя таблицы   -  person Abdullah    schedule 01.07.2014
comment
Не знаю, почему, вероятно, плохой дизайн базы данных.   -  person Gudgip    schedule 01.07.2014


Ответы (3)


Вам нужно экранировать символ $ с помощью \$, так как php рассматривает его как первый символ переменной. Попробуй это:

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

РЕДАКТИРОВАТЬ:

Чтобы избежать экранирования, вы также можете использовать одинарные кавычки ' вместо двойных кавычек ". Тогда PHP не разрешает переменные в строке. (см. этот вопрос)

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

2-е РЕДАКТИРОВАТЬ:

Чтобы объединить две строки, используйте оператор . следующим образом:

$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).'\'';

Но вы НИКОГДА не должны напрямую отправлять параметр GET на свой сервер sql. Любой может проникнуть в вашу базу данных или даже удалить ее. Поэтому вам следует добавить функцию escape, например эту или рассмотрите возможность использования другой db-библиотеки, такой как PDO, и создания параметризованных запросов. Мне может быть достаточно экранировать одинарные кавычки внутри переменной другой одинарной кавычкой, например:

function mssql_escape($str) {
    return str_replace("'", "''", $str);
}
person Daniel    schedule 01.07.2014
comment
Я добавил еще одно возможное решение (Изменить) - person Daniel; 01.07.2014
comment
Массив ( [0] => Массив ( [0] => 42S02 [SQLSTATE] => 42S02 [1] => 208 [код] => 208 [2] => [Microsoft] [SQL Server Native Client 11.0] [SQL Сервер]Недопустимое имя объекта 'dbo.DATABASE COMPANY SERVICES$Employee'. [сообщение] =› [Microsoft][SQL Server Native Client 11.0][SQL Server]Недопустимое имя объекта 'dbo.DATABASE COMPANY SERVICES$Employee'. ) ) - person user3315848; 01.07.2014
comment
Я заменил двойные кавычки на одинарные, и это сработало. Спасибо, Даниэль. - person user3315848; 01.07.2014
comment
Оба предоставленных решения должны привести к точно такому же результату. - person Daniel; 01.07.2014
comment
Теперь моей следующей проблемой являются столбцы, между которыми есть пробелы. Например, имя и фамилия, как в ($rows = sqlsrv_has_rows($stmt); while($obj = sqlsrv_fetch_object($stmt)) { echo $obj-›Имя., .$obj-›Фамилия.‹br /›; }) - person user3315848; 01.07.2014
comment
Если вам нужно придерживаться имен столбцов (в противном случае вы должны удалить все эти пробелы), вы можете переименовать столбцы в своем запросе: SELECT [First Name] AS firstName, [Last Name] AS lastName FROM Dbo.[DATABASE COMPANY SERVICES$Employee] - person Daniel; 01.07.2014
comment
Моя следующая проблема связана с предложением WHERE. Предположим, я хочу выбрать имя и фамилию из Dbo.[DATABASE COMPANY SERVICES$Employee], где адрес электронной почты = поле формы ($_GET['email']) или номер сотрудника = 13 - person user3315848; 02.07.2014
comment
Обычно вы должны открывать новый вопрос для этого, чтобы дать людям возможность ответить вам правильно. (вам также следует пометить ответ как правильный, если он помог вам решить вашу проблему) Я добавлю решение вашей проблемы в свой ответ для правильного форматирования кода. - person Daniel; 02.07.2014
comment
@Danial @user3315848 был 'DATABASE COMPANY SERVICES$Employee', имя вашей таблицы, имя моей таблицы - Staff, поэтому мой запрос будет 'SELECT * FROM Dbo.[Staff]'; - person Dipen; 18.01.2015

Если в имени таблицы есть пробелы, вы должны выполнить такой запрос: $sql = "SELECT * FROM dbo.[DATABASE COMPANY SERVICES]"; Не уверен, что вы пытаетесь сделать с $employee, потому что php видит его как переменную и пытается вставить его туда (я думаю, что здесь $employee имеет значение NULL).

person Gerdinand    schedule 01.07.2014
comment
Однако, если $employee — это имя сотрудника, которого вы хотите получить из базы данных, вы должны использовать $sql = SELECT * FROM dbo.[DATABASE COMPANY SERVICES] WHERE [Last Name] = '$employee'; - person Gerdinand; 01.07.2014

Попробуйте переключить

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

с участием

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

Потому что php считает $Employee переменной, если вы используете двойные кавычки. [] используется, чтобы сообщить базе данных, что имя таблицы DATABASE COMPANY SERVICES$Employee, в противном случае пробел будет указывать на начало другой команды или переменной sql.

Кстати, старайтесь не использовать пробелы в именах таблиц, чтобы избежать путаницы.

person Gudgip    schedule 01.07.2014