【问题标题】:Unable to alter SQL using PDO statement无法使用 PDO 语句更改 SQL
【发布时间】:2019-01-09 08:44:47
【问题描述】:
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 中选择)。 感谢您的帮助。

【问题讨论】:

  • 当您的 SQL 没有要绑定的占位符时,您要绑定什么...?您可能遇到错误,请检查您的日志。
  • 更新是针对表的,由于用户是不同类型的对象,这就是我使用 ALTER 的原因
  • 您的 sql 没有任何占位符但您正在绑定?
  • <a href="reset.php?userid='.$rows['name'].'" class="btn btn-sucess btn-sm" role="button">Reset</a>
  • 我明白了(微软真的是最糟糕的使用通用关键字来处理它们的奇特语法),那么你在=N'Nico1234!' 的字符串之外仍然有N 和绑定问题

标签: php sql-server pdo


【解决方案1】:

ALTER TABLE 语句用于更改表的架构,例如添加列或外键。 您是否正在尝试制作 UPDATE 声明?正确的查询是:

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

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

【讨论】:

  • $sql ="UPDATE LOGIN SET PASSWORD ='Nico1234!' WHERE name=:name"; $stmt = $conn->prepare($sql); $stmt->bindParam(':name', $_GET['name'], PDO::PARAM_STR); $stmt->execute(); 我已关注您的声明,但仍未更新。 :(
  • 也许您可以添加表的 CREATE-Statement(s) 以检查其他错误
  • 我已经从数据库中选择了名称,所以我认为不需要创建?
  • 我的意思是在你的问题中添加它:)
【解决方案2】:

如果要更改 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;
?>

【讨论】:

  • 查询没有改变,没有错误。我认为这与 $_GET['name'];即使我选择并使用相同的变量,名称的值也不是名称本身 (nico)。
  • @NicoGestiada 请检查更新的答案。有几点需要考虑: 1) 设置错误处理为PDO::ERRMODE_EXCEPTION; 2) Try to find why your $_GET['name']`设置为sa; 3) ALTER LOGIN 需要权限。
猜你喜欢
  • 2010-11-18
  • 2012-06-15
  • 2014-01-31
  • 1970-01-01
  • 2017-02-21
  • 2017-04-05
  • 2018-05-14
  • 1970-01-01
  • 2015-01-22
相关资源
最近更新 更多