PHP PDO Mysql插入失败,不抛出任何异常或错误

时间:2014-09-22 03:44:08

标签: php mysql sql pdo

要点:

我有一个函数,我正在使用PHP在MySQL数据库中设置一个键值对,它调用一个实用程序函数来执行所有插入操作。我知道这个实用程序功能有效(与其他功能一起使用)但由于某种原因,它无法插入记录。

令人困惑的部分是它没有抛出PDO异常,我在连接函数中设置了正确的errmode,因此让我感到困惑的是为什么我没有得到任何响应。

知道如何解决这个问题或者让它提供错误吗?

获取ID并在数据库中为其指定键/值的函数

function setCredit($id){
//sets credit bool
//table to insert
$table='accountMeta';
//key
$key="isCredit";
//key value
$value="Y";
//array that is generated to insert 
$valueArray=array("id"=>$id,"key"=>$key,"value"=>$value,"date"=>mysqlTime(currentDate()));
if (isset($id)){
    //run the insert if $id exists
    $results=insert($valueArray,$table);
    echo $results;

} else {
    //fail if $id doesn't exist
    $results="ERROR: Invalid Inputs";

}
return $results;}

实用程序插入

的函数
function insert($array,$table){
//$array should be formatted like "column"=>"data",... etc
$columns="";
$values="";
//generate the insert statement
foreach ($array as $id=>$val){
    $columns.=$id.",";
    $columnBind.=":".$id.",";

}

    //cut off some extra commas after our foreach
$columns=rtrim($columns,",");
$columnBind=rtrim($columnBind,",");
    //get dat connection
$DBH=dbConn();

    //prep the PDO


$sql=$DBH->prepare("Insert into $table($columns) VALUES($columnBind)");

//bind each value in the PDO
foreach ($array as $id=>$val){
    $sql->bindValue(":$id",$val);   

}

try{
    //give'r a go
    $sql->execute();
    return "SUCCESS";
} catch (PDOExecption $e){
    //and if she says no:
    return "ERROR: Failed to Insert";
    logMessage("select ".$e->getMessage());
   }
}

数据库连接功能

function dbConn(){
$dbName=confLine("databaseName");
$dbUser=confLine("databaseUser");
$dbPass=confLine("databasePass");
$dbAddress=confLine("databaseAddress");
try{
    $DBH=new PDO("mysql:host=$dbAddress;dbname=$dbName","$dbUser","$dbPass");
    $DBH->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e){
    echo "Err connecting to DB";
    logMessage("dbConn ".$e->getMessage());
    exit;
}
  return $DBH;
}

1 个答案:

答案 0 :(得分:1)

答案

出现了2个问题:

PHP.ini未设置为提供所需的错误详细程度。感谢@Phil,他在评论中建议在php.ini文件中设置display_errors = on,error_reporting = E_ALL。

在此之后,我收到了这个错误:

  

致命错误:未捕获的异常' PDOException' with message' SQLSTATE [42000]:语法错误或访问冲突:1064 SQL语法中有错误;查看与您的MySQL服务器版本相对应的手册,以获得正确的语法,以便使用“键,值,日期”值(' 9',' isCredit',' ; Y'' 2014年9月21日')'在第1行'在/var/www/html/finance/PHP/utils.inc:133堆栈跟踪:#0 /var/www/html/finance/PHP/utils.inc(133):PDOStatement-> execute()#1 / var / www / html / finance / PHP / functions.inc(116):insert(Array,' accountMeta')#2 /var/www/html/finance/PHP/setCredit.php(5):第133行/var/www/html/finance/PHP/utils.inc中引用的setCredit(' 9')#3 {main}

经过一段很短的调查后发现错误,我发现我在mysql中使用了一个保留字。一个完全明显的,我正在使用' key'作为列名。一旦我将列名更改为未保留的内容,插入就成功了。