php MS SQL查询与WHERE子句和GET参数

时间:2014-07-02 13:25:55

标签: php sql 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] 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 />";
}
?>

如何查询电子邮件等于在提交的表单中输入的电子邮件的列/列?

3 个答案:

答案 0 :(得分:1)

如果你的表单在帖子中,你应该使用$ _POST而不是$ _GET,如果它已经可以了。我会亲自使用帖子。您需要过滤用户的每个输入,如果它是一个字符串,您必须用引号括住变量。

if(filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) {
    $email = $_POST['email'];
    $sql = 'SELECT * FROM Dbo.[DATABASE COMPANY SERVICES$Employee] WHERE Email = "'.$email.'"';
}

答案 1 :(得分:0)

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

$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);
}

答案 2 :(得分:-1)

我对sqlsrv不太了解。但是你的查询有语法错误,

您需要在制作动态字符串

时与点(.)运算符连接
$sql = "SELECT * FROM Dbo.[DATABASE COMPANY SERVICES '".$Employee."'] 
       WHERE Email = '".$_GET['email']."'";