[英]SQLSTATE[HY000]: General error with PHP and PDO
我有一個小的登錄腳本。
function login($sql) {
try {
$fbhost = "localhost";
$fbname = "foodbank";
$fbusername = "root";
$fbpassword = "";
$DBH = new PDO("mysql:host=$fbhost;dbname=$fbname",$fbusername,$fbpassword);
$DBH->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$STH = $DBH->query($sql);
$STH->setFetchMode(PDO::FETCH_ASSOC);
session_start();
if ($row = $STH->fetch()) {
$_SESSION['username'] = "$row[username]";
header("Location:index.php");
}
} catch(PDOException $e) {
echo $e->getMessage();
}
}
編輯:
index.php
$sql = "SELECT username from users where username = ". $_POST['username'] ." AND password = ". $_POST['password'] ."";
login($sql);
以上從插入更改為選擇查詢。 現在我得到新的錯誤: SQLSTATE [42S22]:找不到列:1054“ where子句”中的未知列“ pvtpyro”
根據您的最新編輯:執行INSERT查詢后,無法使用PDO獲取結果。 看到這里: http : //www.php.net/manual/en/pdostatement.fetch.php#105682
編輯:我想,由於該函數的名稱為“ login”,因此您希望擁有類似$ sql的內容:“從用戶所在的用戶名=:username中選擇用戶的密碼”,然后使用while循環遍歷結果,然后登錄用戶密碼是否匹配?
Edit2:根據您的編輯以提供SELECT查詢: 請勿使用此查詢。 您在做什么不是SQL注入證明。 永遠不要使用用戶輸入中的變量(即$ _POST,$ _ GET等)並將其未經過濾地放入SQL查詢中。 請在SO或Google查找術語“准備好的聲明”。 如您所見,由於您忘記了在雙引號前后加上單點(撇號),因此MySQL認為您的輸入引用的是另一列(“ pvtpyro”),而不是將該列中的值與字符串進行比較。 始終使用“:username”,“:password”語法(帶冒號的語法),否則查詢將是不安全的,並且對您的應用程序極為危險。
PDO的構造函數使用2個在您提供的代碼中未定義的變量-$ fbhost和$ fbname。
編輯:
您正在while
循環內調用session_start()
,這可能會導致錯誤。 將其帶出循環。
編輯2:
您應該真正調試代碼。 通過將die
放置在代碼的不同部分中,或者在使用之前,輸出一些有用的信息(這是較不推薦的方式),或者使用xdebug和IDE,這將允許您逐行運行,並查看每一個的確切狀態變量等。
如果我沒正確理解的話, $data
$STH->execute($data);
STH- $STH->execute($data);
應該是一個數組,即使value是1。 因此,您可以嘗試用$STH->execute(array($data));
替換該查詢$STH->execute(array($data));
編輯:
將行更改為此:
$data = array($_POST["username"], $_POST["password"]);
$sql = "INSERT INTO users (username, password) value (?, ?)";
$STH = $DBH->prepare($sql);
$STH->execute($data);
在我看來,您沒有正確連接到數據庫...今天早些時候出現此錯誤,原因就是如此。 或者是您的字符串不正確
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.