带有WHERE子句和GET参数的php MS SQL查询

带有WHERE子句和GET参数的php MS SQL查询,php,sql,sql-server,sqlsrv,Php,Sql,Sql Server,Sqlsrv,如何查询电子邮件与提交表单中输入的电子邮件相等的列 我对sqlsrv不太了解。但是您的查询有语法错误 在生成动态字符串时,需要使用点()运算符连接 <?php $serverName = "(local)"; //serverName $connectionInfo = array( "Database"=>"DabaseNew", "UID"=>"sa", "PWD"=>"*****"); $conn = sqlsrv_connect( $serverName, $co

如何查询电子邮件与提交表单中输入的电子邮件相等的列

我对
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] WHERE Email = $_GET['email']';
$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->Last Name.", ".$obj->First Name."<br />";
}
?>

如果您的表单在post中,您应该使用$\u post而不是$\u GET,如果它在GET中,就可以了。不过,我个人会使用post。您需要过滤来自用户的每个输入,如果变量是字符串,则必须用引号将其括起来

$sql = "SELECT * FROM Dbo.[DATABASE COMPANY SERVICES '".$Employee."'] 
       WHERE Email = '".$_GET['email']."'";

要连接两个字符串,请使用如下操作符:

if(filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) {
    $email = $_POST['email'];
    $sql = 'SELECT * FROM Dbo.[DATABASE COMPANY SERVICES$Employee] WHERE Email = "'.$email.'"';
}
$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).'\'';
正如您在第一次编辑中链接的答案中所看到的那样,
双引号解析中间的变量,而
单引号不解析。您可能的解决方案如下:

if(filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) {
    $email = $_POST['email'];
    $sql = 'SELECT * FROM Dbo.[DATABASE COMPANY SERVICES$Employee] WHERE Email = "'.$email.'"';
}
$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参数顶部。任何人都可以渗透数据库,甚至删除它。因此,你应该添加一个转义函数,或者像使用PDB那样的另一个DB库,并构建参数化查询。请这样说:

if(filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) {
    $email = $_POST['email'];
    $sql = 'SELECT * FROM Dbo.[DATABASE COMPANY SERVICES$Employee] WHERE Email = "'.$email.'"';
}
$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='blablabla$\u GET['email']blabla';
来自$\u GET变量的
'
会打断字符串…他必须使用连接:
$sql='blabla'。$\u GET['email'].blabla'
。事实上,stackoverflows语法highlighter甚至使这一点在原始帖子中非常容易看到。要点是,
$Employee
不应是变量,而应是数据库名称的一部分。(请参阅所有者的最后一个问题)所以需要使用双引号-只需连接邮件字符串。在sql查询中进一步使用GET参数而不转义是一个严重的安全问题!这是我得到的错误:Array([0]=>Array([0]=>42000[SQLSTATE]=>42000[1]=>1038[code]=>1038[2]=>[Microsoft][sql Server原生客户端11.0][sql Server]对象或列名丢失或为空。对于SELECT INTO语句,请验证每个列都有名称。对于其他语句,请查找空别名。不允许使用定义为“”或[]的别名。请将别名更改为有效名称。)