这是我的代码。我需要基本上从我的数据库表中获取所有customerID的列表,并检查通过表单输入的customerID值是否包含在此列表中。我已对它进行了测试,但它无法正常工作。请帮忙!
$validIDProvided = "no";
$arrayOfCustomerIDs =
mysqli_fetch_array(mysqli_query($sqlConnection,"SELECT customerID FROM
customerInfo"), MYSQLI_ASSOC);
foreach($arrayOfCustomerIDs as $ID){
if($ID == $_POST['customerID']){
$validIDProvided = "yes";
}
}
答案 0 :(得分:4)
您正在执行的基本错误是将行作为关联数组提取,因此您需要测试$ ID ['customerID'](为您选择的列命名)以进行匹配。
foreach ($arrayOfCustomerIDs as $row){
if ($row['customerID'] == $_POST['customerID']){
$validIDProvided = "yes";
break;
}
}
但是,上述修复也是解决问题的错误方法。
您应该创建一个选择查询来检查发布的customerID是否在数据库中。让MySQL为你工作,而不是在php中做什么可以由你的数据库本地完成。
if ($statement = mysqli_prepare($mysqli, 'SELECT count(*) FROM customerInfo where customerID = ?')) {
$statement->bind_param('i', $_POST['customerID']);
$statement->execute();
$statement->bind_result($validIDProvided); // save
$statement->fetch();
$statement->close();
}
var_dump($validIDProvided); // Should be 1 or 0, if you don't have duplicates in your database, in either case, you can treat this as a bool
答案 1 :(得分:3)
数据库已经有了实现这一目标的机制。而不是
SELECT customerID FROM customerInfo
并查看响应,将检查移到SQL中,让数据库完成工作:
SELECT count(customerID ) FROM customerInfo WHERE customerID = X;
X是您要搜索的值。然后你的代码只需要查看计数的返回值。 0它不存在,其他任何东西都存在。
想象一下,你有一张包含数百万条记录的大表,你的代码会杀死服务器!
这会有所帮助:https://www.w3schools.com/sql/default.asp让您入门。
答案 2 :(得分:1)
我的代码中有很多东西我可能会建议更改,但首先让我们解决您的原始问题。你应该说:
foreach($arrayOfCustomerIDs as $row) {
$ID = $row["customerID"];
// ...
现在对代码进行一些修复:
$validIDProvided
设置为“是”或“否”,请尝试将其设置为true
和false
- 只需使用布尔值即可。之后您可以说if($validIDProvided)
而不是if($validIDProvided == "yes")
代码:
$pdo = new PDO(/* database connection details */);
$stmt = $pdo->prepare("SELECT COUNT(*) AS cnt FROM customerInfo WHERE customerID = ?");
$stmt->execute($_POST["customerID"]);
$validIDProvided = $stmt->fetch()["cnt"] > 0;
我刚刚意识到一个额外的调整,以提高性能......让我们假设一个特定的customerID
在数据库中存在多次(因此COUNT(*)
会返回2
或{{ 1}}甚至3
...)
我们不关心实际数量是多少,我们只关心它是否超过0.因此,一旦找到单个实例,就可以停止扫描数据库。这是新查询:
300
一旦找到匹配的单个$pdo = new PDO(/* database connection details */);
$stmt = $pdo->prepare("SELECT customerID FROM customerInfo WHERE customerID = ? LIMIT 0, 1");
$stmt->execute($_POST["customerID"]);
$validIDProvided = count($stmt->fetchAll()) > 0;
,这将停止扫描数据库。