由于使用动态PHP输入的SQL查询导致PDO异常,因此出现致命错误
经过将近一天的研究,我真的看不出我的代码有什么错误。我试图创建一个小的原型函数,返回查询结果的行数 我得到的错误是:由于使用动态PHP输入的SQL查询导致PDO异常,因此出现致命错误,php,sql,sql-server,database,Php,Sql,Sql Server,Database,经过将近一天的研究,我真的看不出我的代码有什么错误。我试图创建一个小的原型函数,返回查询结果的行数 我得到的错误是:uncaughtpdoception:SQLSTATE[42000]:[Microsoft][odbcdriver17 for SQL Server][SQL Server]多部分标识符“my@email.com“无法约束。在C:\inetpub\wwwroot\index.php中:59 第59行是$stmt->execute() 我相信问题来自我的SQL查询,但我不是100%确
uncaughtpdoception:SQLSTATE[42000]:[Microsoft][odbcdriver17 for SQL Server][SQL Server]多部分标识符“my@email.com“无法约束。在C:\inetpub\wwwroot\index.php中:59
第59行是$stmt->execute()代码>
我相信问题来自我的SQL查询,但我不是100%确定
代码的工作方式是从POST输入中获取值,并在模式中检查行和列是否包含所述值
此外,我正在使用MSSQL(而不是MySQLi)和PHP来完成任务
这是我希望php代码发送SQL查询并检查结果是否存在的主要部分
<?php
include "connect.php";
if(isset($_POST['login']))
{
$email = $_POST['EMAIL'];
$password = $_POST['PASSWORD'];
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $conn->prepare("SELECT * FROM users WHERE EMAIL=$email;");
$stmt->execute();
$count= $stmt->rowCount();
echo "Row count: $count \n";
}
?>
及
使用包含$email
的数组输入
全部返回相同的错误。
这里有connect.php
,以防万一问题可能来自这里
<?php
$servername = "localhost";
$username = "sa";
$password = "";
try
{
$conn = new PDO("sqlsrv:Server=$servername; Database=db", $username, $password);
// set the PDO error mode to exception
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo "Connected!";
return $conn;
}
catch(PDOException $e)
{
echo "Connection failed: " . $e->getMessage();
}
?>
基本上,我解决问题的方法是将电子邮件和密码转换为VARCHAR
:
$stmt = $conn->prepare("SELECT ID, EMAIL, LAST_NAME FROM users WHERE CONVERT(VARCHAR, EMAIL)='my@email.com' AND CONVERT(VARCHAR, PASSWORD)='1234'");
基本上,我解决问题的方法是将电子邮件
和密码
转换为VARCHAR
:
$stmt = $conn->prepare("SELECT ID, EMAIL, LAST_NAME FROM users WHERE CONVERT(VARCHAR, EMAIL)='my@email.com' AND CONVERT(VARCHAR, PASSWORD)='1234'");
@B001ᛦ 哦,天哪,我道歉。附近的语法不正确
到底是什么?对不起@u_mulder,我不小心粘贴了错误的错误日志。现在它在上面的几行中得到了修复。当时我正在试验,以确定问题是否与输入类型有关,但我不认为是这样。$email
是一个字符串值,应该被引用。或者使用预先准备好的语句。@B001ᛦ 哦,天哪,我道歉。附近的语法不正确
到底是什么?对不起@u_mulder,我不小心粘贴了错误的错误日志。现在它在上面的几行中得到了修复。当时我正在试验,以确定问题是否与输入类型有关,但我不认为是这样。$email
是一个字符串值,应该被引用。或者使用事先准备好的陈述。
$stmt = $conn->prepare("SELECT ID, EMAIL, LAST_NAME FROM users WHERE CONVERT(VARCHAR, EMAIL)='my@email.com' AND CONVERT(VARCHAR, PASSWORD)='1234'");