【问题标题】:replacing sql server query to secure PDO query替换 sql server 查询以保护 PDO 查询
【发布时间】:2014-08-10 07:28:02
【问题描述】:

我尝试将我的非安全查询替换为 PDO(防止 SQL 注入),但我不相信自己在做什么。 我有数据库连接文件:

<?php
$serverName ="db_name\SQLEXPRESS";
 $usr="sa";
 $pwd="SysAdmin1";
 $db="DB"; 
$connectionInfo = array("UID" => $usr, "PWD" => $pwd, "Database" => $db);
$conn = sqlsrv_connect($serverName, $connectionInfo);
?>

还有我的查询文件:

require_once 'db_file.php';
$place=$_POST['place'];
$name=$_POST['name'];
$sql_user = "SELECT * FROM users WHERE name='$name' and place= '$place' ";
$res = sqlsrv_query($conn,$sql_user);
$row = sqlsrv_fetch_array($res);

它工作正常但不安全。我尝试替换为:

$sql_user = $conn -> prepare ("SELECT * FROM users WHERE name = :name and place = :place");  
$sql_user -> execute (array(':name => '$name' ,  :place => '$place''));
$row = $sql_user -> fetch();

我有错误解析错误:语法错误,意外的 T_VARIABLE,期待 ')'。我读了很多关于那个的帖子,但没有支持我做得好还是没有?因为有时查询中的变量是 :name 有时只是?

【问题讨论】:

  • (':name =&gt; '$name' , :place =&gt; '$place'') 更改为 (:name =&gt; $name , :place =&gt; $place) 只是几个错位的引号。我改为删除它们。您也可以使用(':name' =&gt; '$name' , :place =&gt; '$place'),但不需要引号。
  • 感谢@Fred-ii- 我有:致命错误:在非对象中调用成员函数 prepare()
  • (':name' =&gt; "$name" , ':place' =&gt; "$place")怎么样
  • 您可能还需要将 $row = $sql_user -&gt; fetch(); 更改为 while ($row = $sql_user-&gt;fetch(PDO::FETCH_ASSOC)){$var = $row['name']; echo $var; } - 我不知道您想对 fetch 做什么。
  • @Fred-ii- 两者都工作正常,但我目前有致命错误

标签: php sql sql-server pdo


【解决方案1】:

这对我有用:

# connect
try{
    //$pdo = new PDO("sqlsrv:Server=$hostname;Database=$dbname;", $username, $password);  // works with proper driver for PHP.
    $pdo = new PDO("odbc:Driver={SQL Server};Server=$hostname;Database=$dbname;", $username, $password);  // works with proper driver for ODBC and PHP ODBC.
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    ini_set('mssql.charset', 'UTF-8');  // allow Chinese names.
}catch(PDOException $e){
    die("Error connecting to $hostname SQL: ".$e->getMessage());
}

# read
$sql = "SELECT name FROM employees ORDER BY 1";
$stmt = $pdo->prepare($sql);
$stmt->execute();
while($row = $stmt->fetch()){
    echo $row[1]."<br>";
}

# write
try{
    $sql = "INSERT INTO employees(name)
            VALUES (:name)";
    $stmt = $pdo->prepare($sql);
    $stmt->bindValue(':name', $new_employee);
    $stmt->execute();
}catch(PDOException $e){
    echo "Could not add employee $new_employee!";
}

More tutorials

【讨论】:

    猜你喜欢
    • 2021-12-26
    • 2018-06-08
    • 2012-06-18
    • 1970-01-01
    • 2020-05-08
    • 2015-11-29
    • 2016-07-29
    • 2020-03-06
    • 1970-01-01
    相关资源
    最近更新 更多