无法使用PDO语句更改SQL

时间:2019-01-09 08:44:47

标签: php sql-server pdo

if (isset($_GET['ResetPassword']))  { 
    $name = $_GET['name'];
    $sql = "ALTER LOGIN $name WITH PASSWORD=N'Nico1234!'";
    $stmt = $conn->prepare($sql);
    $stmt->bindParam(':name', $_GET['name'], PDO::PARAM_STR); 
    $stmt->execute();
} 

大家好,我无法更改某个名称(用户)的密码,该名称来自get(从sql中选择)。 感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

ALTER TABLE语句用于更改表的模式,例如添加列或FOREIGN KEYS。 您是否要制作UPDATE语句?正确的查询是:

"UPDATE Login SET PASSWORD='Nico1234!' WHERE name=:name"

如果要将$_GET['name']参数添加到语句中,则必须在其中的任何位置使用:name

答案 1 :(得分:0)

如果要更改SQL Server登录帐户的属性,请使用ALTER LOGIN。 这里的问题将是您语句中的参数。 表名和列名不能用PDO中的参数替换。我不确定,但是我认为登录名是相同的。 因此,在这种情况下,您应该使用不带参数的语句,转义特殊字符并手动清理数据。

请注意,当您要使用参数时,占位符的正确语法是:name?,而不是$name

<?php
...
try {
   # SQL Authentication
   $conn = new PDO("sqlsrv:server=$server;Database=$database", $uid, $pwd);
   # Windows Authentication
   #$conn = new PDO("sqlsrv:server=$server;Database=$database");
   $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch( PDOException $e ) {
   die( "Error connecting to SQL Server".$e->getMessage());
}

...
try {
    $name = $_GET['name'];
    $password = 'Nico1234!';
    # Escape special characters and do some check for $name and $password values 
    $stmt = $conn->prepare("ALTER LOGIN $name WITH PASSWORD = N'$password'");
    $stmt->execute();
} catch( PDOException $e ) {
    die("Error executing query: ".$e->getMessage() );
}
...
?>

ALTER LOGIN需要权限才能正确执行。如果使用Windows身份验证,则使用Web服务器的进程标识或线程标识(如果Web服务器正在使用模拟)来连接到SQL Server。使用下一个脚本获取更多信息(在SQL和Window身份验证之间进行更改):

<?php
# Connection
$server    = 'server\instance,port';
$database  = 'database';
$uid       = 'uid';
$pwd       = 'pwd';

# PDO Connection
try {
    # SQL authentication
    #$conn = new PDO("sqlsrv:server=$server;Database=$database", $uid, $pwd);
    # Windows authentication
    $conn = new PDO("sqlsrv:server=$server;Database=$database");
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch( PDOException $e ) {
    die( "Error connecting to SQL Server".$e->getMessage());
}

# 
try {
    $stmt = $conn->query("SELECT 'SUSER_SNAME' AS [NAME], CONVERT(nvarchar(128), SUSER_SNAME()) AS [VALUE]");
    # Data
    while ($row = $stmt->fetch(PDO::FETCH_ASSOC) ){
        echo $row['NAME'].": ".$row['VALUE']."</br>";
    }    
} catch( PDOException $e ) {
    die( "Error executing query".$e->getMessage() );
}

#
$stmt = null;
$conn = null;
?>