PHP MySQL查询数据库和WHERE子句
我正在学习PHP和MySQL,在构建过程中遇到一两个问题 我有一个HTML表单,用户可以输入他们的详细信息和狗的详细信息。然后脚本检查数据库中的用户名和狗名。如果两者都存在于数据库中,则会更改dog表上的用户ID以更改所有权。如果用户不存在,则将用户详细信息输入数据库并更改所有权 我确实完成了整个工作,但没有使用bindParam从表单中收集数据,并被告知这将是一个更好的选择。这就是乐趣的开始。现在,我可以使用下面的脚本计算表中的行,但是,我不能在SELECT查询中使用WHERE子句。我尝试放置“WHERE name\u first=:name\u first”,但由于出现“Parameter not defined”错误而失败 我需要能够使用用户的名字和姓氏,以便能够从数据库中选择该用户ID 我还有一个关于使用事先准备好的声明的问题。如果我使用脚本顶部的语句从数据库中进行选择,并且所有表单输入都绑定到$STH,那么如何运行不同的查询,例如,如何使用相同的绑定将用户详细信息插入数据库 谁能看一下剧本,告诉我哪里出了问题PHP MySQL查询数据库和WHERE子句,php,html,mysql,sql,database,Php,Html,Mysql,Sql,Database,我正在学习PHP和MySQL,在构建过程中遇到一两个问题 我有一个HTML表单,用户可以输入他们的详细信息和狗的详细信息。然后脚本检查数据库中的用户名和狗名。如果两者都存在于数据库中,则会更改dog表上的用户ID以更改所有权。如果用户不存在,则将用户详细信息输入数据库并更改所有权 我确实完成了整个工作,但没有使用bindParam从表单中收集数据,并被告知这将是一个更好的选择。这就是乐趣的开始。现在,我可以使用下面的脚本计算表中的行,但是,我不能在SELECT查询中使用WHERE子句。我尝试放置
<?php
/***mysql username***/
$user = 'root';
/***mysql password***/
$pass = '';
if ($_SERVER['REQUEST_METHOD'] == "POST") {
try {
$DBH = new PDO('mysql:host=localhost;dbname=kennel_cert;', $user, $pass);
$DBH->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$DBH->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
//Queries
$sql1 = "SELECT user_ID FROM user_details";
$sql2 = "SELECT dog_ID FROM dog_details";
$STH = $DBH->prepare("SELECT * FROM user_details"); //Needs a WHERE clause to work
//var_export($STH);
//User details form
$STH->bindParam(':name_first', $_POST['name_first']);
$STH->bindParam(':name_last', $_POST['name_last']);
$STH->bindParam(':email', $_POST['email']);
$STH->bindParam(':telephone', $_POST['telephone']);
$STH->bindParam(':name_number', $_POST['name_number']);
$STH->bindParam(':street', $_POST['street']);
$STH->bindParam(':city', $_POST['city']);
$STH->bindParam(':county', $_POST['county']);
$STH->bindParam(':postcode', $_POST['postcode']);
//Dog details form
$STH->bindParam(':dog_reg', $_POST['dog_reg']);
$STH->bindParam(':name', $_POST['name']);
$STH->bindParam(':microchip', $_POST['microchip']);
$STH->bindParam(':gender', $_POST['gender']);
$STH->bindParam(':day', $_POST['day']);
$STH->bindParam(':month', $_POST['month']);
$STH->bindParam(':year', $_POST['year']);
$STH->execute(); //Execute the select script
//Use this to count the users - However without the WHERE it is counting all users not the one submitted into the form
if($STH->rowCount() > 0) {
echo "Exists <br>"; }
else {
echo "Doesn't exist <br>"; }
//var_export($userQuery); //Displays the contents of the query for testing
//Find if user exists in database - Again another way of counting the total but not the one inputed into the form
$userResult = $DBH->query($sql1);
if ($userResult !== false) {
$count = $userResult->rowCount();
echo 'Number of users: '.$count. '<br>';
foreach($userResult as $row) {
echo $row['user_ID'].'<br>';
}
}
//Find if dog exists in database - Again another way of counting the total but not the one inputed into the form
$dogResult = $DBH->query($sql2);
if ($dogResult !== false) {
$count = $dogResult->rowCount();
echo 'Number of dogs: '.$count. '<br>';
foreach($dogResult as $row) {
echo $row['dog_ID'].'<br>';
}
}
} catch (PDOException $e) {
echo $e->getMessage();
}
//echo "<p>Data submitted successfully</p>";
}
//Disconnect from the server
$DBH = null;
?>
当我运行此命令时,会出现以下错误:
PDOStatement::__set_state(array( 'queryString' => 'SELECT user_ID FROM user_details WHERE name_first = :name_first AND name_last = :name_last', ))
SQLSTATE[HY093]: Invalid parameter number: parameter was not defined
我完全迷路了,我在兜圈子,找不到任何能帮助我解决这个问题的东西
我确实按照我所说的那样使用这个设置运行了脚本,但是,有人告诉我对表单使用bindParam,这将杀死脚本和我
<?php
/***mysql username***/
$user = 'root';
/***mysql password***/
$pass = '';
if ($_SERVER['REQUEST_METHOD'] == "POST") {
try {
$DBH = new PDO('mysql:host=localhost;dbname=kennel_cert;', $user, $pass);
$DBH->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$DBH->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
//Queries
$userQuery = $DBH->query("SELECT user_ID FROM user_details WHERE name_first = '$first' AND name_last = '$last'"); //Checks if the user exists in the database
$dogQuery = $DBH->query("SELECT dog_ID FROM dog_details WHERE dog_ID = '$dog_reg' AND name = '$name' AND gender = '$gender'");
//User details form
$first = $_POST['name_first'];
$last = $_POST['name_last'];
$email = $_POST['email'];
$telephone = $_POST['telephone'];
$name_number = $_POST['name_number'];
$street = $_POST['street'];
$city = $_POST['city'];
$county = $_POST['county'];
$postcode = $_POST['postcode'];
//Dog details form
$dog_reg = $_POST['dog_reg'];
$name = $_POST['name'];
$microchip = $_POST['microchip'];
$gender = $_POST['gender'];
$day = $_POST['day'];
$month = $_POST['month'];
$year = $_POST['year'];
$u = ""; //Variable for counting users
$d = ""; //Variable for counting dogs
//var_export($userQuery); //Displays the contents of the query for testing
//Find if user exists in database
foreach($userQuery as $row1) { //Count the number of users in the database
$u++;
}
//Find if dog exists in database
foreach($dogQuery as $row2) { //Count the number of dogs in the database
$d++;
}
//The echos are for testing purposes
echo "Dog ID is: ".$row2['dog_ID']."<br>"; //Finds the ID of the dog and displays it
echo "User ID is: ".$row1['user_ID']."<br>"; //Finds the ID of the user and displays it
$newUserID = $row1['user_ID']; //Store the ID for future use
$newDogID = $row2['dog_ID']; //Store the ID for future use
//Perform if both user and dog exist
if ($u > 0 && $d > 0) { //If both the user and the dog exist in the database change the owner of the dog
echo "Both Match"; //Confirm both exist
$q = $DBH->prepare("UPDATE dog_details SET user_ID = '$newUserID' WHERE dog_ID = '$newDogID'"); //update the table to change ownership
$q->execute(); //Execute the change
}
// Perform if only dog exists
elseif ($u == 0 && $d > 0) { //If the user does not exist but the dog does.
echo "Dog matches but user does not exist"; //Confirm what exists
//Insert user details into user_details table and set the foreign user_ID key in the dog_details table
$q1 = $DBH->prepare("INSERT INTO user_details (name_first,name_last,email,telephone,name_number,street,city,county,postcode) VALUES ('$first','$last','$email','$telephone','$name_number','$street','$city','$county','$postcode')");
$q1->execute();
echo "<br>Insert complete<br>";*/
}
elseif ($u > 0 && $d == 0) {
echo "The dog does not exist - this is a problem";
//Form needs returning with values and asks user to check details
}
elseif ($u == 0 && $d == 0) {
echo "Both don't match";
}
} catch (PDOException $e) {
echo $e->getMessage();
}
//echo "<p>Data submitted successfully</p>";
}
//Disconnect from the server
$DBH = null;
?>
检查需要在绑定参数之前将占位符放入sql中的选项:
$query = "SELECT * FROM user_details
WHERE name_first = :name_first
AND name_last = :name_last
AND email = :email
etc...";
$STH = $DBH->prepare($query);
好的,我已经将查询更改为:-$sql1=从user\u details中选择user\u ID,其中name\u first=':name\u first'和name\u last=':name\u last';-$STH=$DBH->prepare($sql1);这运行,但表示数据库中没有用户,我知道有5个?小心不要在那里添加单引号,并检查列名是否与表中的列名匹配。仍然不起作用,根据您的建议,我收到一个错误消息:无效参数号:参数不存在defined@Blinkydamo所有参数都需要在查询中不只是我建议的那些Cheers Wilmer,直到我尝试并且现在我理解了,我才太确定你的意思。我不知道只有绑定到查询中的变量需要绑定,这是有意义的。我删除了除了两个名称绑定之外的所有东西,并且它工作了。
$query = "SELECT * FROM user_details
WHERE name_first = :name_first
AND name_last = :name_last
AND email = :email
etc...";
$STH = $DBH->prepare($query);