【问题标题】:How to escape & and ' in mssql and Php?如何在 mssql 和 Php 中转义 & 和 '?
【发布时间】:2012-11-16 00:50:25
【问题描述】:

我很确定在这种情况下我需要类似 preg_replace 的东西,但我不确定如果是的话,应该把它放在哪里。我有一个页面,允许人们搜索员工目录(PHP 和 MSSQL)。他们可以按姓氏、建筑物或部门进行搜索。姓氏和建筑物都很好,但我的三个部门有问题,其中两个有 & (即 Grants & Planning),当您单击该部门时,它不会返回任何结果,我认为是因为它没有将“&计划”识别为整个字符串的一部分。我遇到的另一个问题是我有一个部门有一个 ' 并且它会引发错误

  • PHP 警告:mssql_query() [function.mssql-query]:消息:第 1 行:“s”附近的语法不正确。 (严重性 15)在 C:\Inetpub\wwwroot\DACC\directory\dept.php 第 179 行

    *PHP 警告:mssql_query() [function.mssql-query]:消息:字符串 'ORDER BY Lastname' 之前的未闭合引号。 (严重性 15)在 C:\Inetpub\wwwroot\DACC\directory\dept.php 第 179 行*

第 179 行是这个... $query = mssql_query("SELECT * FROM directory WHERE Displayname = '$department' ORDER BY Lastname");

这是按部门查询页面的其余代码......如果有人可以帮助我,我将不胜感激! `

$department = $_GET['dept'];

 // This will evaluate to TRUE so the text will be printed.
 if (isset($department)) {
 $query = mssql_query("SELECT * FROM directory WHERE Displayname = '$department' ORDER BY Lastname");//$query = mssql_query("SELECT * FROM directory WHERE department IN (SELECT id FROM departments WHERE name='$department') ORDER BY Lastname");
 $query2 = mssql_query(
 "SELECT TOP 1 directory.FirstName, directory.Lastname, directory.email,
 directory.phone, directory.office, directory.title, directory.displayname,                departments.id AS dept_id, departments.name AS dept_name, departments.url AS dept_url
 FROM directory
 INNER JOIN departments on directory.displayname = departments.name
 WHERE directory.displayname = '$department'
 ORDER BY directory.LastName");
 $numofrows = @mssql_num_rows($query);
 // Check if there were any records
 if (!mssql_num_rows($query)) {
echo 'No records found';
echo '<br /><a href="/directory/">Go Back</a>';
 } else {
 while($row1 = mssql_fetch_array($query2))
   {
  $dept_var = $row1['dept_name'];
 $dept_id = $row1['dept_id'];
 $dept_url = $row1['dept_url'];
    print "<h3><a href=\"$dept_url\">$dept_var</a></h3>";
 }
 print "<table id=\"directory_table\" width=\"480\">
 <tr>
 <th>Name</th>
 <th>Email</th>
 <th>Phone</th>
 <th>Office</th>
 <th>Title</th>
 </tr>";    
 for($i = 0; $i < $numofrows; $i++) 
{
$row = mssql_fetch_array($query);
    if($i % 2) 
    { 
    print '<tr bgcolor="#ffffff">';
    } 
else 
    { 
    print '<tr bgcolor="#eeeeee">';
    }

    print "<td>" . $row['Firstname'] . " " . $row['Lastname'] . "&nbsp;&nbsp;</td>";
    print "<td><a href=\"mailto:" . $row['email'] . "\">" . $row['email']. "</a>&nbsp;&nbsp;</td>";
    print "<td>" . $row['phone'] . "&nbsp;&nbsp;</td>";
    print "<td>" . $row['Office'] . "&nbsp;&nbsp;</td>";
    print "<td>" . $row['Title'] . "&nbsp;&nbsp;</td>";
    print "</tr>";
}
 print "</table>";
 }
 // Free the query result
 mssql_free_result($query);
 }
 else
 print "No Search Defined";
 ?>

已编辑以显示更改 好的,试试这个:

    $serverName = "localhost"; //serverName\instanceName
    $connectionInfo = array( "Database"=>"DACC", "UID"=>"daccweb", "PWD"=>"go");
    $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));
}
//$conn = sqlsrv_connect("connection string here");
$queryParams = array($department);


//Selector links
print "<a href=\"/directory/\">Go back to main search</a><br />";
print "<u>Search for Employees:</u><br /><br />\n";

print "<br />";





//$officeloc = $_GET['building'];
$department = $_GET['dept'];

// This will evaluate to TRUE so the text will be printed.
if (isset($department)) {


$query = sqlsrv_query($conn, "SELECT * FROM directory WHERE Displayname = ? ORDER BY Lastname", $params);

$query2 = sqlsrv_query($conn, "SELECT TOP 1 directory.FirstName, directory.Lastname, directory.email,
directory.phone, directory.office, directory.title, directory.displayname,
 departments.id AS dept_id, departments.name AS dept_name, departments.url AS dept_url
 FROM directory
INNER JOIN departments on directory.displayname = departments.name
WHERE directory.displayname = ?
ORDER BY directory.LastName", $params);

新编辑
查询运行但不回显/打印结果 $query = sqlsrv_query($conn, "SELECT * FROM directory WHERE Displayname = ? ORDER BY Lastname", $params);

$query2 = sqlsrv_query($conn, "SELECT TOP 1 directory.FirstName, directory.Lastname, directory.email,
directory.phone, directory.office, directory.title, directory.displayname,
departments.id AS dept_id, departments.name AS dept_name, departments.url AS dept_url
FROM directory
INNER JOIN departments on directory.displayname = departments.name
WHERE directory.displayname = ?
ORDER BY directory.LastName", $params);


$numofrows = @@sqlsrv_has_rows($query);

// Check if there were any records
if (!@sqlsrv_has_rows($query)) {
echo 'No records found';
echo '<br /><a href="/directory/">Go Back</a>';
} else {



while($row1 = sqlsrv_fetch_array($query2))
  {
    $dept_var = $row1['dept_name'];
    $dept_id = $row1['dept_id'];
    $dept_url = $row1['dept_url'];


   print "<h3><a href=\"$dept_url\">$dept_var</a></h3>";
  //echo "</h3><br />";
    }



    print "<table id=\"directory_table\" width=\"480\">
    <tr>
<th>Name</th>
<th>Email</th>
<th>Phone</th>
<th>Office</th>
<th>Title</th>

</tr>"; 
for($i = 0; $i < $numofrows; $i++) 
{
$row = sqlsrv_fetch_array($query);
    if($i % 2) 
    { 
    print '<tr bgcolor="#ffffff">';
    } 
else 
    { 
    print '<tr bgcolor="#eeeeee">';
    }

    print "<td>" . $row['Firstname'] . " " . $row['Lastname'] . "&nbsp;&nbsp;</td>";
    print "<td><a href=\"mailto:" . $row['email'] . "\">" . $row['email']. "</a>&nbsp;&nbsp;</td>";
    print "<td>" . $row['phone'] . "&nbsp;&nbsp;</td>";
    print "<td>" . $row['Office'] . "&nbsp;&nbsp;</td>";
    print "<td>" . $row['Title'] . "&nbsp;&nbsp;</td>";
    print "</tr>";
}
print "</table>";
}

// Free the query result
sqlsrv_free_stmt($query);
}
else
print "No Search Defined";

【问题讨论】:

  • 您的代码容易受到SQL injection attacks 的攻击。在您了解它们以及如何避免它们之前,请停止工作。
  • 我没有构建此页面,只是尝试修复它,直到可以完成完整的站点重建。
  • 在消除 SQL 注入漏洞之前,它不会被“修复”。现在有人可能会通过简单的搜索删除您数据库中的所有内容。
  • Alvaro,不,它不是重复的,我不想阻止 SQL 注入,我正在研究如何修复不喜欢 & 和 ' 的查询

标签: php sql-server preg-replace


【解决方案1】:

你可以在 PHP 和 MSSQL 中使用 SQL 参数,看看这个:

http://blogs.msdn.com/b/sqlphp/archive/2008/09/30/how-and-why-to-use-parameterized-queries.aspx

您的参数值将自动转义,无需您做任何工作。

您需要使用 sqlsrv 驱动程序,请参阅:http://www.php.net/manual/en/sqlsrv.setup.php

为了获得行数,我们还需要指定一些查询选项。 (看看http://www.php.net/manual/en/function.sqlsrv-num-rows.phphttp://msdn.microsoft.com/en-us/library/hh487160.aspx

$conn = sqlsrv_connect("connection string here");
$queryParams = array($department);
$queryOptions = array( "Scrollable" => "buffered" );
$query = sqlsrv_query($conn, "SELECT * FROM directory WHERE Displayname = ? ORDER BY Lastname", $queryParams, $queryOptions);

$query2 = sqlsrv_query($conn, "SELECT TOP 1 directory.FirstName, directory.Lastname, directory.email,
directory.phone, directory.office, directory.title, directory.displayname,
departments.id AS dept_id, departments.name AS dept_name, departments.url AS dept_url
FROM directory
INNER JOIN departments on directory.displayname = departments.name
WHERE directory.displayname = ?
ORDER BY directory.LastName", $queryParams, $queryOptions);

$numofrows = sqlsrv_num_rows($query);

请注意,您构建数组的顺序必须与? 符号在查询中出现的顺序相匹配。由于每次查询只使用一个参数,且参数相同,因此只需要构建一个数组即可。

然后,您可以将所有 mssql 函数替换为 sqlsrv 函数,有关函数列表及其用法,请参阅文档:http://www.php.net/manual/en/ref.sqlsrv.php

【讨论】:

  • 查看我的编辑,我也包含了文档的链接 =]
  • 谢谢 Sean 我会试一试...有时我认为 SQL 和 PHP 会是我的死神。
  • 哦,会的,不用担心......天堂。您最好使用 MySQL 作为数据库或使用 .Net 作为 Web 应用程序。显然我知道这几乎从来没有这么简单,但无论如何都值得一提 =]
  • 在您的第一段代码的底部,您有 mssql_free_result($query) 尝试将其更改为 sqlsrv_free_stmt($query)。文档:php.net/manual/en/function.sqlsrv-free-stmt.php
  • 好的,我认为我的查询工作正常,但它没有打印结果,我认为这与使用 for($i = 0; $i &lt; $numofrows; $i++) { $row = mssql_fetch_array($query); if($i % 2) { print '&lt;tr bgcolor="#ffffff"&gt;'; } else { print '&lt;tr bgcolor="#eeeeee"&gt;'; }
猜你喜欢
  • 2017-11-21
  • 1970-01-01
  • 2012-12-06
  • 1970-01-01
  • 1970-01-01
  • 2015-08-24
  • 1970-01-01
  • 2016-03-26
  • 1970-01-01
相关资源
最近更新 更多