【问题标题】:PDO invalid data source issuePDO 无效数据源问题
【发布时间】:2015-03-01 00:47:29
【问题描述】:

我正在做一个项目并在一个类中使用 PDO,所有函数都像一个魅力,但我有一个返回无效数据源错误的函数,这是文本副本:

致命错误:未捕获异常“PDOException”,消息“无效” 数据源名称'在 /home/decoded/public_html/studiobug/xxxx/class.php:194

堆栈跟踪:

#0 /home/decoded/public_html/studiobug/xxxx/class.php(194):
PDO->__construct('DB_DSN', 'DB_USERNAME', 'DB_PASSWORD') 
#1 /home/decoded/public_html/studiobug/xxxx/deleteQuiz.php(5):
Admin->goodByeQuiz('2') 
#2 {main} thrown in
/home/decoded/public_html/studiobug/xxxx/class.php on line 194

这里有两个类中的公共函数,第一个工作正常,第二个是返回错误的那个。 我找不到发生了什么,因为代码几乎相同,只是查询发生了变化。

public function saveEditQuestions($quizno,$todo) {
 $table = "quiz".$quizno."Questions";
 $sql = "";
  $sql .= "TRUNCATE $table;"; 
 foreach ($todo as $c => $v){        
  $sql .= "INSERT INTO $table SET ";
  $sql .= "option1 = '".$v['Answer1']."', ";
  $sql .= "option2 = '".$v['Answer2']."'; ";
 }
 
   $con = new PDO(DB_DSN, DB_USERNAME, DB_PASSWORD);
   $con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
   $con->setAttribute(PDO::ATTR_EMULATE_PREPARES, 1);

try {
$stmt = $con->prepare($sql);
$success = $stmt->execute();
return $success;
}
catch (PDOException $e)
{
echo $e->getMessage();
die();
}   
}
public function goodByeQuiz($del) {    
  $table1 = "quiz".$del."Questions";
  $table2 = "quiz".$del."Results";
  $sql = "UPDATE formStatus set active = 0 WHERE formNumber = $del;";
  $sql .= "TRUNCATE $table1;";  
  $sql .= "TRUNCATE $table2;";

   $con = new PDO(DB_DSN, DB_USERNAME, DB_PASSWORD);
   $con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
   $con->setAttribute(PDO::ATTR_EMULATE_PREPARES, 1);
 
try {
$stmt = $con->prepare($sql);
$success = $stmt->execute();
return $success;
}
catch (PDOException $e)
{
echo $e->getMessage();
die();
}   
}

【问题讨论】:

  • 你定义了 DB_DSN、DB_USERNAME 和 DB_PASSWORD 吗?
  • 是的,当然,第一个函数(saveEditQuestions)工作正常,当我调用第二个函数时,我得到了那个异常
  • stacktrace 提到'DB_DSN'(一个字符串)的事实表明不存在这样的常量(如果您检查 PHP 错误日志,您会看到一个 PHP 通知抱怨这个)。查看定义这些常量的代码,当您调用第二个函数时很可能没有包含它。
  • 所以var_dump 调用函数并检查值时的值。
  • @DCoder 所说的......这可能是问题所在。另外,为什么在每个方法中重新创建连接为什么不在构造过程中将其作为属性存储在类中???

标签: php pdo


【解决方案1】:

问题似乎与您的连接有关。像这样使用它....

connect.php

<?php 
$db_host = "localhost";
$db_name = "blogdata";
$db_user = "username";
$db_pass = "password";
$db = new PDO("mysql:host=$db_host;dbname=$db_name", $db_user, $db_pass);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
?>

在你的函数中,

require 'connect.php';

并在任何你想要的地方使用这个连接

【讨论】:

  • 做到了,但我仍然很好奇为什么在特定功能上没有被“识别”,而在其他功能上却很好......
  • 这就是 Dcoder 所解释的......“当你调用第二个函数时,它很可能不包括在内”。
  • 是的,但同样,为什么不包含在这个特定的功能中而他们在其他功能中?没什么,我对这个解决方案很满意。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-31
  • 2011-02-25
  • 1970-01-01
  • 1970-01-01
  • 2018-06-15
相关资源
最近更新 更多