【问题标题】:HTML POST and fetch arrayHTML POST 和获取数组
【发布时间】:2011-02-24 00:37:52
【问题描述】:

这里有两个问题:
1.我对复选框的值有疑问
2.我对 mysql_fetch_array 有疑问($变量,ASSOC);方法 --> 我数据库中的所有数据都是 VARCHAR 类型

1. 所有以'Cb'结尾的变量表示该值来自FORM的复选框。如果选中复选框,则表示该行(例如:用户名)将在我的数据库的 Select 方法中(例如:SELECT Username FROM...)

我收到此错误 1. 未定义索引:C:\wamp\www\Projet Compte Utilisateur\manip_liste.php 中的第 7 行中的 fonctionCb 2. 未定义变量:第 14 行 C:\wamp\www\Projet Compte Utilisateur\manip_liste.php 中的选项卡 ...等所有复选框 如果它们没有被选中 ..这是我的 PHP 代码

<?php   
$prep = "";

if(!$_POST['username'])
    echo 'Nom d\'utilisateur manquant';

if(($_POST["userCb"]) && ($_POST["suffixeCb"]) && ($_POST["fonctionCb"]) && ($_POST["passwordCb"])){
    $prep = " * ";
    $tab = "User    SUFFIXE     SITE    FONCTION    PASSWD";
}
else{   
        if($_POST["userCb"]){
            $prep += "username ,";
            $tab += "USER   ";
        }           
        if($_POST["suffixeCb"]){
            $prep += "suffixe ,";
            $tab += "SUFFIXE    ";
        }   
        if($_POST["passwordCb"]){
            $prep += "password ,";
            $tab += "PASSWD ";
        }
        if($_POST["siteCb"]){
            $prep += "siteWeb ,";
            $tab += "SITE   ";
        }
        if($_POST["fonctionCb"]){
            $prep += "fonction ";
            $tab += "Fx ";
        }
    }//ELSE

require("db_action.php");   //Require in the database connection.
$bd = db_open();
$data = db_select($prep,  $_POST["username"]); //Envoie des variables à afficher et du Username pour le SELECT

echo "'$tab'";
echo "'$data'";    ?>    

2. 第二个错误 而且我从 fetch_array 方法中得到了这个错误 错误:警告:mysql_fetch_array() 期望参数 1 是资源,第 68 行 C:\wamp\www\Projet Compte Utilisateur\db_action.php 中给出的字符串

这是我方法中的代码

function db_select($prep, $username){

        $querycon = "SELECT '$prep' FROM info_compte WHERE username = '$username'";
        if(!mysql_query($querycon)){
            echo "Il n\'y a aucun '$username' dans la base de données";
            $response = "";
        }
        else{
                while ($row = mysql_fetch_array(mysql_query($querycon), MYSQL_ASSOC))
                    printf("%s  %s  %s  %s  %s", $row["username"], $row["suffixe"], $row["password"], $row["siteWeb"], $row["fonction"]);  //The PRINTF dont work 
            }

        return $response;   
}//db_select

谢谢大家的回答,我指定我是一个想要学习的实践初学者..

【问题讨论】:

  • 对不起,这不是我的本意
  • @ThorDozer:你应该用.=而不是+=连接字符串。另外,尝试使用类似于isset() 的东西来检查是否设置了值。而且我假设您的 $tab 变量没有被设置为如果条件失败,因此您的连接尝试会引发错误。
  • @Russel Dias: isset() 是什么意思;方法。我应该把它放在哪里?
  • @ThorDozer:您正在测试是否存在的任何变量。
  • 第一个问题已经回答。第二个还在出现

标签: php mysql html checkbox


【解决方案1】:

对于第 1 部分,一个问题是您可能在 $prep 末尾有一个尾随逗号,具体取决于您最终选择的列。要解决此问题,请尝试以下代码(请注意,我在列名周围添加了反引号,这是一种很好的做法,但不是必需的)。 isset() 函数检查变量是否实际存在。目前您正在尝试访问可能不存在的变量,因此会出现错误。

<?php   
$prep = array();
$tab = '';

if(!isset($_POST['username']))
    echo 'Nom d\'utilisateur manquant';

if(isset($_POST["userCb"]) && isset($_POST["suffixeCb"]) && isset($_POST["fonctionCb"]) && isset($_POST["passwordCb"])){
    $prep[] = "*";
    $tab = "User    SUFFIXE     SITE    FONCTION    PASSWD";
}
else{   
        if(isset($_POST["userCb"])){
            $prep[] = "`username`";
            $tab .= "USER   ";
        }           
        if(isset($_POST["suffixeCb"])){
            $prep[] = "`suffixe`";
            $tab .= "SUFFIXE    ";
        }   
        if(isset($_POST["passwordCb"])){
            $prep[] = "`password`";
            $tab .= "PASSWD ";
        }
        if(isset($_POST["siteCb"])){
            $prep[] = "`siteWeb`";
            $tab .= "SITE   ";
        }
        if(isset($_POST["fonctionCb"])){
            $prep[] = "`fonction`";
            $tab .= "Fx ";
        }
    }//ELSE

// This line glues the pieces of the $prep array back together
$prep = implode(',', $prep);

require("db_action.php");   //Require in the database connection.
$bd = db_open();
$data = db_select($prep,  $_POST["username"]); //Envoie des variables à afficher et du Username pour le SELECT

echo "'$tab'";
echo "'$data'";    ?> 

对于您的第 2 部分错误,您必须将 mysql_query 的返回值分配给一个变量并将其传递给 mysql_fetch_array。您不只是将查询字符串传递给它。试试这个:

function db_select($prep, $username){
        $username = mysql_real_escape_string($username);
        $querycon = "SELECT $prep FROM info_compte WHERE username = '$username'";
        $response = mysql_query($querycon);
        if(!$response){
            echo "Il n\'y a aucun '$username' dans la base de données";
            $response = "";
        }
        else{
                while ($row = mysql_fetch_array($response, MYSQL_ASSOC))
                    foreach($row as $item)
                    {
                        echo $item.' ';
                    }
                }

        return $response;   
}//db_select

更新:

请注意,除了第 1 部分的大量补充之外,我在第 2 部分的 SQL 语句中删除了 $prep 周围的单引号。

阅读isset(),您也可以考虑使用array_key_exists()。我不确定两者的相对性能比较。

【讨论】:

  • 我所有来自printf的变量都是未定义索引
  • @ThorDozer 那么你的 $prep 值可能是错误的,它可能不应该有单引号。您的 info_compte 表中的列是“用户名”、“后缀”等...您用作数组键吗?
  • @Endophage:是的,我验证了四次。
  • @Endophage: 是的,我现在正在这样做。但我真的需要在变量$prep 中的单词周围加上单引号吗?
  • @ThorDozer 它们不是单引号。这是一个单引号:' 这是一个反引号:` 反引号用于在 SQL 中描述数据库、表和列的名称。您不必使用它们,但这是一个很好的做法,以防在某些时候您不小心将 SQL 保留关键字用作列名。反引号将确保 SQL 在这种情况下不会出错。
【解决方案2】:

也许在顶部定义 $tab 和 $prep 将摆脱“未定义变量”-错误

【讨论】:

    【解决方案3】:

    至于你的第二个问题,expects parameter 1 to be resource, string given 声明你给了它一个字符串。在您的代码中,您只需给它$querycon 的值,即$querycon = "SELECT '$prep' FROM info_compte WHERE username = '$username'"; 一个字符串。

    您应该为mysql_query 函数分配一个$ 变量,并在mysql_fetch_array 方法中使用它作为第一个参数。

    为了完整起见:

    要回答您的第一个问题,您的 $tab 变量没有设置为 if 条件失败,因此您的连接尝试会引发错误。

    【讨论】:

    • DONE --> 但是..如果你看一下'printf'..当我执行它时......除了 $tab 的值之外什么都没有出现
    • @ThorDozer:没有必要打电话给mysql_query 两次。只需在您的第一个 if 语句之前为其分配一个变量。另外,你能在while循环中做一个$rowvar_dump吗?
    • @Russel Diaz:我很抱歉:S 就像我说我是一个初学者而且.. 我是法国人,所以我不明白你最后评论的全部内容。关于 var_dump .. 我需要做什么?
    • @ThorDozer:var_dump 是转储变量数据的好方法。我只是想看看$row 是否返回任何东西。因为你的代码对我来说看起来不错......而且,为了确定,在你的文档集的开头error_reporting(-1);
    • @Russel Dias:printf 行上的每个变量都是未定义索引,例如变量$row['username'],不返回任何内容(null)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-05
    • 1970-01-01
    • 2017-03-23
    • 1970-01-01
    • 2018-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多