使用PHP循环MySQL列

时间:2017-10-16 12:41:55

标签: php mysql mysqli foreach

这是我的代码。我需要基本上从我的数据库表中获取所有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";
    }
}

3 个答案:

答案 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设置为“是”或“否”,请尝试将其设置为truefalse - 只需使用布尔值即可。之后您可以说if($validIDProvided)而不是if($validIDProvided == "yes")
  • 查看PHP的PDO库。这是向数据库发送请求的首选方式
  • 您应该简单地询问数据库是否存在提供的客户ID,而不是返回所有ID并迭代列表(如果您有数百万或数十亿行,则会非常慢)。这可以利用数据库的索引。请尝试以下方法:

代码:

$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; ,这将停止扫描数据库。