【问题标题】:SQLSTATE[42S22]: Column not found: 1054 Unknown column '$value' in 'field list''SQLSTATE [42S22]:未找到列:1054 '字段列表'中的未知列 '$value'
【发布时间】:2016-01-06 09:54:30
【问题描述】:
try {
    $db = new PDO("mysql:host=$host;dbname=$dbname",$user,$password) ; 
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $formInfo = array('fname','lname','email','password','gender') ;
    $entry = array() ;
    foreach($formInfo as $data) {

     $entry[$data] = $_POST[$data]; 

     }
    //print_r($entry); 


    $salt = Hash::gen_salt() ;
    $sqlcollum = array(
                'First_name'=> $entry['fname'] ,
                'Last_name' => $entry['lname'] ,
                'email'     => $entry['email'] ,
                'password'  => Hash::gen_password($entry['password'],$salt) ,
                'salt'      => $salt,
                'gender'    => $entry['gender'] ,
                'date'      => date('Y-m-d H:i'),
                'groups'    => '1'
             ) ;
    $sqlKeys = array_keys($sqlcollum) ;
    $sqlValues = array_values($sqlcollum) ;
    $keys = "'".implode("','", $sqlKeys)."'" ;
    $value = "'".implode("','", $sqlValues)."'" ;
    //echo $keys."<br/>" ;
    //echo $value."<br/>" ;


    $db->beginTransaction() ;

    $insert = $db->query('INSERT INTO register ($keys) VALUES ($value)') ;

    if($insert) {
        echo "true" ;
    } else {
        $db->errorCode() ;
        echo "false" ;
    }
   $db->commit() ;


 } catch(PDOExpection $e) { 
    $db->rollback() ;
    die($e->getMessage()) ;
} 

为什么会出现这个错误?

error::Uncaught exception 'PDOException' with message 'SQLSTATE[42S22]: Column not found: 1054 Unknown column '$value' in 'field list'' in register.php:46

【问题讨论】:

    标签: php pdo


    【解决方案1】:
    $insert = $db->query('INSERT INTO register ($keys) VALUES ($value)');
    

    应该是

    $insert = $db->query("INSERT INTO register ('$keys') VALUES ('$value')");
    

    $insert = $db->query('INSERT INTO register ('.$keys.') VALUES ('.$value.')');
    

    $insert = $db->query(sprintf('INSERT INTO register (%s) VALUES (%s)', $keys, $value));
    

    您的代码不工作的原因是 PHP $keys$value 像您所做的那样插入到字符串中,它们只是字符串本身的一部分,因此值不会被变量替换。

    【讨论】:

    • @DonCallisto now error is 'SQLSTATE[HY000]: General error: mode must be an integer' in register.php
    • @leecarter 您的连接字符串不是遇到同样的问题吗?尝试将其替换为$db = new PDO('mysql:host="$host";dbname="$dbname"',$user,$password);
    • @DonCallisto 你的新错误 no such host as new $db
    • @leecarter 我想你的错误在别处,我们不能再帮助你了。对不起。
    • $insert = $db->query('INSERT INTO register ("$keys") VALUES ("$value")');错了。
    【解决方案2】:

    您的代码中有两个问题:

    1) 当您在查询中将这些引号用作字符串时,无需添加额外的引号。

    替换:

    $keys = "'".implode("','", $sqlKeys)."'" ;
    $value = "'".implode("','", $sqlValues)."'" ;
    

    与:

    $keys = implode("','", $sqlKeys);
    $value = implode("','", $sqlValues); 
    

    2) 将字符串变量放入引号中:

    $insert = $db->query("INSERT INTO register ('$keys') VALUES ('$value')") ;
    

    【讨论】:

      【解决方案3】:

      你可以试试这个。

       $keys = implode(",",$sqlKeys) ;
      

      这个工作。

      【讨论】:

      • 这不是问题。
      • 好的,现在我看到它是正确的,而所有其他答案都是错误的。如果您添加解释为什么要进行此更改,您的答案会更有用。
      • @Naktibalda 我无法解释答案,同样的问题发生在我身上。但在大多数情况下,我发现列名不需要单引号,所以我尝试使用它。例如w3schoolmysqltutorial
      • 我会帮忙:列名使用了错误的引号类型,列名必须不加引号或用反引号引用 - `。而且您的答案只是部分的(其他答案也是部分的)- INSERT 语句周围的引号还有另一个问题。
      猜你喜欢
      • 1970-01-01
      • 2019-10-14
      • 2021-10-31
      • 2018-10-23
      • 2017-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多