从 MySQL 转换后 PDO 脚本不起作用


PDO Script Not Working After Converting from MySQL

提前感谢您的帮助。我在第一部分中有一个带有 AJAX 电子邮件收集表单的登录页面,我改编自此 Tutsplus 教程。

但是,表单的PHP部分是用MySQL编写的,它与我的Heroku服务器不兼容,因为它已被弃用。从其他人那里得到关于stackoverflow的建议,我尝试将代码中的MySQL语句转换为PDO。但是很难使表单起作用。

这是原始工作的MySQL代码

<?php
if($_GET['action'] == 'signup'){
// if(isset($_GET['action'])&& $_GET['action'] == 'signup'){
	mysql_connect('hostname','username','password');
	mysql_select_db('databasename');
	$email = mysql_real_escape_string($_POST['emailfield']);
	//validate email address - check if input was empty
	if(empty($email)){
		$status = "error";
		$message = "You did not enter an email address!";
	}
	else if(!filter_var($email, FILTER_VALIDATE_EMAIL)){ //validate email address - check if is a valid email address
			$status = "error";
			$message = "You have entered an invalid email address!";
	}
	else {
		$existingSignup = mysql_query("SELECT * FROM table WHERE signup_email_address='$email'");   
		if(mysql_num_rows($existingSignup) < 1){
			date_default_timezone_set('Asia/Singapore');
			$date = date('Y-m-d');
			$time = date('H:i:s');
			
			$insertSignup = mysql_query("INSERT INTO table (signup_email_address, signup_date, signup_time) VALUES ('$email','$date','$time')");
			if($insertSignup){ //if insert is successful
				$status = "success";
				$message = "You have been signed up!";	
			}
			else { //if insert fails
				$status = "error";
				$message = "Oops, Theres been a technical error!";	
			}
		}
		else { //if already signed up
			$status = "error";
			$message = "This email address has already been registered!";
		}
	}
	
	//return json response
	$data = array(
		'status' => $status,
		'message' => $message
	);
	echo json_encode($data);
	exit;
}
?>

这是我尝试将上述MySQL代码转换为PDO的失败尝试

<?php
if(isset($_GET['action'])&& $_GET['action'] == 'signup'){
	try {
		$db = new PDO('mysql:host=hostname;dbname=dbname;charset=utf8','user','pwd');
	}
	catch(exception $e) {
		echo "Error, connection failure";
	}
	$email = $_POST['emailfield'];
	//validate email address - check if input was empty
	if(empty($email)){
		$status = "error";
		$message = "You did not enter an email address!";
	}
	else if(!filter_var($email, FILTER_VALIDATE_EMAIL)){ //validate email address - check if is a valid email address
			$status = "error";
			$message = "You have entered an invalid email address!";
	}
	else {
		$existingSignup = "SELECT COUNT(*) FROM table WHERE signup_email_address='$email'";
		if ($res->fetchColumn() < 1) {
			date_default_timezone_set('Asia/Singapore');
			$date = date('Y-m-d');
			$time = date('H:i:s');
			
			$insertSignup = "INSERT INTO table (signup_email_address, signup_date, signup_time) VALUES (:signupemail, :signupdate, :signuptime)";
		    $query = $db->prepare($insertSignup);
		    $query->bindParam(':signupemail', $email);
		    $query->bindParam(':signupdate', $date);
		    $query->bindParam(':signuptime', $time);
		    $results = $query->execute();
			if($insertSignup){ //if insert is successful
				$status = "success";
				$message = "You have been signed up!";	
			}
			else { //if insert fails
				$status = "error";
				$message = "Oops, Theres been a technical error!";	
			}
		}
		else { //if already signed up
			$status = "error";
			$message = "This email address has already been registered!";
		}
	}
	
	//return json response
	$data = array(
		'status' => $status,
		'message' => $message
	);
	echo json_encode($data);
	exit;
}
?>

你能给我纠正PDO代码的建议吗?谢谢!

更新:

这是我更新的PDO代码:

<?php
if(isset($_GET['action'])&& $_GET['action'] == 'signup'){
	try {
		$db = new PDO('mysql:host=hostname;dbname=dbname;charset=utf8','user','pwd');
		$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
		error_reporting(-1);
	}
	catch(PDOexception $e) {
		echo "Error, connection failure";
	}
	$email = $_POST['emailfield'];
	//validate email address - check if input was empty
	if(empty($email)){
		$status = "error";
		$message = "You did not enter an email address!";
	}
	else if(!filter_var($email, FILTER_VALIDATE_EMAIL)){ //validate email address - check if is a valid email address
			$status = "error";
			$message = "You have entered an invalid email address!";
	}
	else {
			$existingSignup = "SELECT * FROM table WHERE signup_email_address='$email'";
			$stmt = $db->query($existingSignup);
			$row_count = $stmt->rowCount();
			if ($row_count < 1) {
			date_default_timezone_set('Asia/Singapore');
			$date = date('Y-m-d');
			$time = date('H:i:s');
			
			$insertSignup = "INSERT INTO table (signup_email_address, signup_date, signup_time) VALUES (:signupemail, :signupdate, :signuptime)";
		    $query = $db->prepare($insertSignup);
		    $query->bindValue(':signupemail', $email);
		    $query->bindValue(':signupdate', $date);
		    $query->bindValue(':signuptime', $time);
		    $results = $query->execute();
			if($insertSignup){ //if insert is successful
				$status = "success";
				$message = "You have been signed up!";	
			}
			else { //if insert fails
				$status = "error";
				$message = "Oops, Theres been a technical error!";	
			}
		}
		else { //if already signed up
			$status = "error";
			$message = "This email address has already been registered!";
		}
	}
	
	//return json response
	$data = array(
		'status' => $status,
		'message' => $message
	);
	echo json_encode($data);
	exit;
}
?>

但这是我得到的错误:致命错误:在第 27 行对索引中的非对象调用成员函数 query(.php)。

其中第 27 行:

$stmt = $db->query($existingSignup);

我该如何解决这个问题?

您的

$existingSignup查询未执行。您必须使用类似以下内容:

$stmt = $db->query($existingSignup);
$row_count = $stmt->rowCount();
echo $row_count.' rows selected

然后继续:if ($row_count < 1) {...}

有关详细信息,请参阅此链接:http://wiki.hashphp.org/PDO_Tutorial_for_MySQL_Developers