有没有办法在预准备语句上调用PDOStatement :: execute()时获取原始SQL字符串?出于调试目的,这将非常有用.
我PDOStatement用来查询数据库.每当我得到一个返回的行时,我希望将它$row[0]作为键提取到数组中,并将行中的后续元素作为值.
当然,我可以编写一个foreach循环和if条件组合来完成这项工作,如下所示:
private static function GetMySQLResult($dbname, $sqlString) {
$dbh = self::ConstructPDOObject($dbname);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$result=array();
foreach ($dbh->query($sqlString) as $row)
{
$result[$row[0]][]=$row[1]; // the simplest case for 2 columns, should add more to handle more columns
}
return $result;
}
Run Code Online (Sandbox Code Playgroud)
但我正在寻找一种现有的方法; 有没有这样的方法已经存在?
当超过mysql的wait_timeout时,我的PHP CLI脚本失去了连接.我无法更改wait_timeout,那么当我使用PDOStatement执行查询时,如何构建一个重新连接的try/catch语句?
是否有一个列表描述了您可以使用的所有data_type参数PDOStatement::bindParam()?如果没有,你通常使用什么,以及什么类型的领域?
根据PHP手册:data_type使用PDO :: PARAM_*常量的参数的显式数据类型.
我知道PDO::PARAM_INT和PDO::PARAM_STR.我听说过,PDO::PARAM_LOB但我不知道如何以及何时使用它.(约会?)
的PDOStatement对象:: bindValue()方法提供了一种方式来指定绑定的变量的类型:
PDOStatement :: bindValue($ parameter,$ value [,$ data_type = PDO :: PARAM_STR ])
我想知道,指定数据类型的目的是什么,而当作为default(PARAM_STR)离开时,数据库最终会在使用它之前将值转换为正确的类型?
例如,如果您对INTEGER字段进行了以下查询:
INSERT INTO table (integerField) VALUES (?) ;
SELECT * FROM table WHERE integerField = ? ;
Run Code Online (Sandbox Code Playgroud)
并且您在PHP中绑定一个整数,PDO默认将它绑定为一个字符串,这相当于:
INSERT INTO table (integerField) VALUES ("1") ;
SELECT * FROM table WHERE integerField = "1" ;
Run Code Online (Sandbox Code Playgroud)
这将完美地工作,因为SQL数据库(至少MySQL,我真的不知道它将如何在其他RDBMS上工作)知道如何在使用它之前将字符串转换回整数.
有哪些用例会对绑定的类型参数与字符串产生影响?
在MySQL文档中,有一个关于mysql_affected_rows在事务提交后使用的注释:http:
//php.net/manual/en/function.mysql-affected-rows.php
注意:事务
如果您正在使用事务,则需要在INSERT,UPDATE或DELETE查询之后调用mysql_affected_rows(),而不是在COMMIT之后调用.
但是,该PDOStatement::rowCount文档没有这样的说明:http:
//www.php.net/manual/en/pdostatement.rowcount.php
这是否意味着在使用PDO对象时INSERT,UPDATE或DELETE查询后提交不会影响受影响的行数?
您好我想在会话中存储或保存一个对象,使用类如SessionHandler或数组$ _SESSION,我已经看到,如果我序列化该对象,我可能不会丢失该对象的方法实例..我已经看到seralizing它是可能的,但我想要存储的对象是由PDOStatement :: fetchObject()创建的,虽然实例类是"Users"我得到这个错误:
PDOException:您无法序列化或反序列化PDO实例为什么?它不是PDO实例..
对不起,我是西班牙人,我不会说英语.谢谢
我有一个有两列的表.表:ctgtable和列:id和ctg.由于我完全从以前的mysql_*功能转移到PDO,我面临一些愚蠢的错误(或者可能缺乏知识).
我想将整个表的ctg列(总共最多20行)选择为具有整数索引的数组.
在我看来,最接近的解决方案是:
<?php
$sth = $dbh->prepare("SELECT id, ctg FROM ctgtable");
$sth->execute();
/* Fetch all of the values of the second column */
$result = $sth->fetchAll(PDO::FETCH_COLUMN, 1);
var_dump($result);
?>
Run Code Online (Sandbox Code Playgroud)
对于相同的结果,还有其他更短/更好的替代方案吗?或者这是获取结果的最佳/唯一可能方法.
id ctg
01 movie
27 tv
64 sports
Run Code Online (Sandbox Code Playgroud)
等等
Array( 1 => "tv",
2 => "movie",
3 => "anime",
4 => "game",
5 => "telugu"
);
Run Code Online (Sandbox Code Playgroud)
索引可以从0开始,也可以不从0开始.对我来说无关紧要.我试着寻找这样一个可能的问题,但似乎没有一个问题与我的问题相关.
我正在尝试在PHP中学习和使用PDO.我在query()方法中遇到了一个问题.
我试图用来$sth = $db->query("SELECT * FROM titles ORDER BY RAND() LIMIT 1");随机选择一个网站的标题,但由于某种原因,$sth总是假的.它的工作原理,当我用prepare()和execute(),但我试图找到什么是错的query().
这是我正在调用的整个函数:
function getTitle($db)
{
if($db)
{
$db->exec("USE " . $dbsite);
$sth = $db->query("SELECT * FROM titles ORDER BY RAND() LIMIT 1");
$title = $sth->fetch(PDO::FETCH_ASSOC);
$db->exec("UPDATE titles SET count = count + 1 WHERE id = " . $title['id']);
return $title['title'];
}
else
return 'Home - Database Offline';
}
Run Code Online (Sandbox Code Playgroud) 使用时PDOStatement::bindParam(),可以将参数绑定到变量 - 这在多次执行预准备语句时尤其有用,每个语句具有不同的参数值.例如:
$dbh = new PDO('mysql:dbname=foo', 'eggyal', 'password1');
$qry = $dbh->prepare('DELETE FROM bar WHERE qux = ?');
$qry->bindParam(1, $qux, PDO::PARAM_INT);
while (true) {
$qux = ... ;
$qry->execute();
// etc
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:
是否可以将参数绑定到对象的成员变量?例如:
$qry->bindParam(1, $obj->qux, PDO::PARAM_INT);
Run Code Online (Sandbox Code Playgroud)如果是这样,对象的成员变量是这样的参数绑定:在bindParam()调用时引用的那个,还是在语句执行时引用的那个?例如:
$obj->qux = 123;
$obj = new stdClass();
$obj->qux = 456;
$qry->execute(); // which value is used for qux ?
Run Code Online (Sandbox Code Playgroud)这种行为记录在哪里(如果有的话)?
pdostatement ×10
php ×10
pdo ×9
mysql ×4
sql ×2
bindvalue ×1
oop ×1
persistence ×1
transactions ×1