我只是尝试PDO并且我得到了这个错误,致命错误:在非对象上调用成员函数fetch(),但是它不是已经在$ this-> db对象上了吗?
class shoutbox {
private $db;
function __construct($dbname, $username, $password, $host = "localhost" )
{ # db conections
try {
$this->db = new PDO("mysql:host=".$hostname.";dbname=".$dbname, $username, $password);
}
catch(PDOException $e)
{
echo $e->getMessage();
}
}
function getShouts()
{
$sql_shouts = $this->db->query('SELECT shoutid, message, pmuserid, ipadress, time FROM shouts WHERE pmuserid == 0');
return $sql_shouts->fetch(PDO::FETCH_OBJ);
}
}
Run Code Online (Sandbox Code Playgroud) 我在解决一些简单的PHP代码以在MySQL表中插入记录时遇到困难.
直接输入WAMP的代码工作正常:
INSERT INTO `users` (`userName`,`userEmail`) VALUES ('orange','orange@gmail.com')
Run Code Online (Sandbox Code Playgroud)
这个PHP代码不起作用:
<?php
$dbHost="localhost";
$dbName="project";
$dbUser="admin";
$dbPassword="abcd";
$dbh=new PDO("mysql:host=$dbHost;dbName=$dbName", $dbUser, $dbPassword);
print_r($dbh);
echo "</br>";
print_r($dbh->errorInfo());
$query=$dbh->prepare("INSERT INTO users (userName, userEmail) VALUES (?,?)");
echo "</br>";
print_r(var_dump($query->errorInfo()));
echo "</br>";
print_r($query->errorCode());
echo "</br>";
print_r($dbh->errorInfo());
$query->bindValue(1, 'apple');
echo "</br>";
print_r(var_dump($query->errorInfo()));
echo "</br>";
print_r($query->errorCode());
echo "</br>";
print_r($dbh->errorInfo());
$query->bindValue(2, 'apple@gmail.com');
echo "</br>";
print_r(var_dump($query->errorInfo()));
echo "</br>";
print_r($query->errorCode());
echo "</br>";
print_r($dbh->errorInfo());
$inserted=$query->execute(); //True if succesful, False if not.
echo "</br>";
print_r(var_dump($query->errorInfo()));
echo "</br>";
print_r($query->errorCode());
echo "</br>";
print_r($dbh->errorInfo());
echo "</br>";
if ($inserted){print_r("true");}else{print_r("false");}; …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用PHP session_set_save_handler,我想使用PDO连接来存储会话数据.
我有这个函数作为写操作的回调:
function _write($id, $data) {
logger('_WRITE ' . $id . ' ' . $data);
try {
$access = time();
$sql = 'REPLACE INTO sessions SET id=:id, access=:access, data=:data';
logger('This is the last line in this function that appears in the log.');
$stmt = $GLOBALS['db']->prepare($sql);
logger('This never gets logged! :(');
$stmt->bindParam(':id', $id, PDO::PARAM_STR);
$stmt->bindParam(':access', $access, PDO::PARAM_INT);
$stmt->bindParam(':data', $data, PDO::PARAM_STR);
$stmt->execute();
$stmt->closeCursor();
return true;
} catch (PDOException $e) {
logger('This is never executed.');
logger($e->getTraceAsString());
}
}
Run Code Online (Sandbox Code Playgroud)
前两条日志消息总是显示出来,但是后面的第三条消息永远$stmt = …
我不明白为什么这些行不起作用:
$host = 'localhost';
$dbname='mydbname';
$login='mylogin';
$pwd='mypwd';
$datex = date('Y/m/d H:i:s');
$nomx = 'jrmy';
$numx = '007';
try {
$bdd = new PDO('mysql:host='.$host.';dbname='.$dbname, $login, $pwd);
}
catch(Exception $e) {
die('Erreur : '.$e->getMessage());
}
$bdd->exec('INSERT INTO dossiers(date, nom, numero, disp) VALUES(\''.$datex.'\', \''.$nomx.'\', \''.$numx.'\', \'Y\')');
$id = $bdd->lastInsertId();
$bdd= null;
echo 'id: '.$id;
Run Code Online (Sandbox Code Playgroud)
披露:该脚本在我的apache服务器上工作,因为我在IIS服务器上安装了我的脚本,它停止工作...
并且查询功能完美运行...查询确定,插入NO
编辑:谢谢大家!真!
我正在进行从mysql_*调用到使用PDO调用的更改,并且无法在开发新代码时弄清楚如何调试我的实际SQL.
在mysql_*调用下我可以在PHP函数中编写一些SQL,并且可以echo使用实际的SQL来查看处理器正在使用的内容.
我无法在PDO库中找到这样的野兽.debugDumpParams看起来应该如此,但它不会吐回绑定语句.
我遇到的问题的例子:
在我的第一次尝试中,我绑定了一个字符串,并在SQL语句中包含引号,尽管绑定了一个data_type字符串 - 它只是通过fluke我尝试从语句中删除引号; 调试会让我看到那里有一个重复的引用.
我将一些代码从一个项目复制到另一个项目,并意外忘记更正数据库名称.当然,SQL失败了,因为其他数据库中不存在这些表.但该程序刚刚返回了正确的错误结果.在PHP日志或MySQL日志中没有任何地方或任何地方,我得到一个提示,表我不在寻找它的地方.
那么,其他人如何为PDO SQL调用进行调试呢?我错过了什么?:)
我正在学习PDO,我感到非常困惑,我在下面有这段代码,所有看起来都对我,但是我得到这个错误代码,我不知道我要做什么来解决它,请帮助我:
<?php
$hostname='localhost';
$username='root';
$password='';
try {
$dbh = new PDO("mysql:host=$hostname;dbname=stickercollections",$username,$password);
echo 'Connected to Database<br/>';
$sql = "SELECT * FROM stickercollections";
foreach ($dbh->query($sql) as $row)
{
echo $row["collection_brand"] ." - ". $row["collection_year"] ."<br/>";
}
$dbh = null;
}
catch(PDOException $e)
{
echo $e->getMessage();
}
?>
Run Code Online (Sandbox Code Playgroud)
错误代码 : Invalid argument supplied for foreach() in /Applications/XAMPP/xamppfiles/htdocs/GOTSWAPMAIN/index.php on line 11
我有一个非常简单的 UPDATE 查询,当我在 PHPMyAdmin 中执行它时它可以工作(所以它不是 SQL 语法错误)。但是,当我尝试使用 PHP PDO 执行查询时,没有显示任何错误,并且没有一行受到查询的影响。
我有错误报告设置是这样的:PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION。但没有显示错误。我的 PHP 代码如下所示:
try {
$sql = "UPDATE user
SET username = :username,
activation_token = :activation_token,
activation_date_time = :activation_date_time,
activation_status = :activation_status
WHERE activation_token = :current_activation_token";
$stmt = $dbh->get_instance()->prepare($sql);
$stmt->bindParam(':username', $username, PDO::PARAM_STR);
$stmt->bindParam(':activation_token', $empty_activation_token, PDO::PARAM_STR);
$stmt->bindParam(':activation_date_time', $datetime, PDO::PARAM_STR);
$stmt->bindParam(':activation_status', $active_status, PDO::PARAM_STR);
$stmt->bindParam(':current_activation_token', $activation_token, PDO::PARAM_STR);
$stmt->execute();
echo 'username: ' . $username;
}
catch(PDOException $e) {
echo $e;
}
Run Code Online (Sandbox Code Playgroud)
我还检查了我是否以某种方式使用了保留关键字或类似的东西,但我很确定事实并非如此。为什么这不起作用?
我需要更新数据库,并execute()通过将数组作为参数使用PDO的方法。
这个想法是当我尝试插入一个NULL值时给我一个错误...
这是发送查询/参数的示例:
生成的查询:
UPDATE table SET name=?, id_extra1=?, id_extra2=? WHERE id_something=?
Run Code Online (Sandbox Code Playgroud)
参数数组:
array (size=8)
'name' => string 'testing' (length=6)
'id_extra1' => string '2' (length=1)
'id_extra2' => null
'id_something' => string '1958' (length=4)
Run Code Online (Sandbox Code Playgroud)
所以NULL值是id_extra2
在代码中,id_extra2我遇到了这样的情况(想法是我有一个ID,或者为0,然后必须使用来更新DB值NULL):
if ($_POST['id_extra2']==0) {
$_POST['id_extra2'] = null;
}
Run Code Online (Sandbox Code Playgroud)
我试着设置$_POST['id_extra2']到''和NULL和'null',但它仍然没有工作...
任何想法表示赞赏!谢谢!
我无法弄清楚这一点,并且没有搜索产生结果。
查询:
$QUERY = "SELECT rp.perm_id
FROM ac_br_user-roles AS ur
JOIN ac_br_roles-permissions AS rp ON rp.role_id = ur.role_id
WHERE ur.user_id = ?";
Run Code Online (Sandbox Code Playgroud)
我尝试使用``反引号''单引号和{}大括号将表名和\反斜杠括在 -处以转义-连字符,但无济于事。
错误:
PDOException:SQLSTATE [42601]:语法错误:7 错误:“-”第 2 行或附近的语法错误:FROM ac_br_user-roles AS ur ^ in
或“位于或附近”无论我在第 2 行尝试使用的转义字符
更新
$QUERY = 'SELECT rp.perm_id
FROM `ac_br_user-roles` AS ur
JOIN `ac_br_roles-permissions` AS rp ON rp.role_id = ur.role_id
WHERE ur.user_id = ?';
Run Code Online (Sandbox Code Playgroud)
" LINE 2: FROMPDOException:SQLSTATE [42601]:语法错误:7 错误:“ ac_br_user-roles` AS …
这个问题让我发疯,我尝试了一切.是不是给我任何错误,但它也没有向数据库插入任何内容.数据库连接很好,应该没有拼写错误.请看一下,看看你是否能找到问题:
$err = array();
if (isset($_POST['submit'])) {
$ip = gethostbyname($_SERVER['REMOTE_ADDR']);
$date = "2012-02-02 02:02:02"; //Example
$uploader_name = $_POST['uploader_name'];
// Validation happens here...
if (empty($err)) {
$host = "host";
$dbname = "db";
$user = "user";
$pass = "pass";
try {
$dbh = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);
$sql = "INSERT INTO `table` (`ip`, `date`, `uploader_name`)
VALUES (:ip, :date, :uploader_name)";
$stmt = $dbh->prepare($sql);
# the data we want to insert
$params = array(
':ip' => $ip,
':date' => $date,
':uploader_name' => $uploader_name
); …Run Code Online (Sandbox Code Playgroud)