如何使PDO适配器每次连接时运行SET NAMES utf8,在ZendFramework中。 我正在使用INI文件来保存适配器configuration数据。 我应该在那里添加什么条目? 如果不清楚,我正在寻找正确的语法,在我的项目的config.ini文件中,而不是在php代码中,因为我认为这部分的configuration代码。
我有几个类执行一些MySQL查询和准备语句。 但是,我迷失在如何将PDO对象包含在这些类中。 例如,我想要做这样的事情: <?php $dbh = new PDO(…); class Foo extends PDO { public $dbh; public function bar() { $this->dbh->prepare('SELECT * FROM table'); $this->dbh->execute(); } } ?> 不幸的是,这是行不通的。 任何人都可以build议一个优雅的方式做到这一点 谢谢你的时间。 抱歉,我是新手,如果您对任何事情不清楚,请留下您的意见,我会尽我所能来回应!
我一直做mysql_connect , mysql_pconnect的简单连接: $db = mysql_pconnect('*host*', '*user*', '*pass*'); if (!$db) { echo("<strong>Error:</strong> Could not connect to the database!"); exit; } mysql_select_db('*database*'); 在使用这个函数的时候,我总是使用简单的方法在查询之前转义任何数据,无论是INSERT , SELECT , UPDATE还是DELETE ,使用mysql_real_escape_string $name = $_POST['name']; $name = mysql_real_escape_string($name); $sql = mysql_query("SELECT * FROM `users` WHERE (`name` = '$name')") or die(mysql_error()); 现在我明白这在一定程度上是安全的! 它逃脱了危险的人物; 但是,它仍然容易受到其他可能包含安全字符的攻击,但可能会对显示数据或在某些情况下恶意修改或删除数据有害。 所以,我search了一下,发现了PDO,MySQLi和准备好的语句。 是的,我可能会迟到,但是我已经阅读了许多教程(tizag,W3C,博客,Googlesearch),没有一个提到过这些。 这似乎很奇怪,为什么只是逃避用户的input实际上是不安全的,不好的做法至less可以说。 是的,我知道你可以使用正则expression式来解决这个问题,但是我相信这还不够? 根据我的理解,当用户inputvariables时,使用PDO /准备语句是一种更安全的方式来存储和检索数据库中的数据。 唯一的问题是,切换(特别是在被困在我以前的编码习惯之后)有点困难。 […]
我有一个脚本,每晚做很多练习。 它使用一个在循环中执行的PDO准备语句。 前几个运行良好,但是我得到了一个失败的错误:“MySQL服务器已经消失”。 我们运行MySQL 5.0.77。 PHP版本5.2.12 该网站的其余部分运行良好。
PDO显然没有办法计算从select查询返回的行数( mysqli具有num_rowsvariables)。 有没有办法做到这一点,使用count($results->fetchAll()) ?
我经常看到使用bindParam或bindValue与PDO的代码。 仅仅是因为任何原因而传递参数来皱起眉头? 我明白, bindParam实际上绑定到variables,并且你可以设置bind方法绑定参数的types,但是如果你只是插入string呢? $query = "SELECT col1 FROM t1 WHERE col2 = :col2 AND col3 = :col3 AND col4 = :col4"; $pdo->bindValue(':col2', 'col2'); $pdo->bindValue(':col3', 'col3'); $pdo->bindValue(':col4', 'col4'); 我经常看到上面,但是我个人更喜欢: $pdo->execute(array(':col2' => 'col2', ':col3' => 'col3', ':col4' => 'col4')); 这不是一个冗长而直观的方式,让我更有意义地把input“一起进入”查询。 但是,我几乎没有看到它使用。 当不需要利用前者的特殊行为时,是否有理由更喜欢bind方法而不是传递参数来execute ?
从PDO手册: PDOStatement :: rowCount()返回由相应PDOStatement对象执行的最后一个DELETE,INSERT或UPDATE语句影响的行数 。 如果由关联的PDOStatement执行的最后一条SQL语句是SELECT语句,则某些数据库可能会返回该语句返回的行数 。 但是,这种行为不能保证所有的数据库 ,不应该依赖便携式应用程序。 我最近才发现。 我只是改变了我的数据库抽象层不使用SELECT COUNT(1) …因为只是查询实际的行,然后计算结果会更有效率。 现在PDO不支持! 我不使用PDO的MySQL和PgSQL,但我做的SQLite。 有没有一种方法(没有完全改变dbal回来)在PDO中计算这样的行? 在MySQL中,这将是这样的: $q = $db->query('SELECT a, b, c FROM tbl WHERE oele = 2 GROUP BY boele'); $rows = $q->num_rows; // and now use $q to get actual data 使用MySQLi和PgSQL驱动程序,这是可能的。 所有PDO都不是! PS。 我最初的解决scheme是扩展SQLResult->计数方法(我自己的),以取代SELECT … FROM通过SELECT COUNT(1) FROM ,只是返回该数字(非常低效,但只适用于SQLite PDO)。 这还不够好,因为在上面的查询中是一个GROUP […]
从MySQL库中迁移之后,我正在使用PDO。 我用什么来代替旧的real_escape_string()函数? 我需要逃避单引号,所以他们会进入我的数据库,我认为可能有更好的方法来处理这一点,而不添加斜杠到我所有的string。 有人能告诉我我应该用什么?
我只需要帮助这个PHP错误,我不太明白: 致命错误:无法在第13行的/web/stud/openup/inactivatesession.php中通过引用传递参数2 <?php error_reporting(E_ALL); include('connect.php'); $createDate = mktime(0,0,0,09,05,date("Y")); $selectedDate = date('dm-Y', ($createDate)); $sql = "UPDATE Session SET Active = ? WHERE DATE_FORMAT(SessionDate,'%Y-%m-%d' ) <= ?"; $update = $mysqli->prepare($sql); $update->bind_param("is", 0, $selectedDate); //LINE 13 $update->execute(); ?> 这个错误是什么意思? 这个错误怎么解决?
我正在尝试使用下面的代码来build立一个新的PDO连接。 new PDO("mssql:driver=????;Server={$serverName};Database={$databaseName}", $username, $password, array(PDO::ATTR_PERSISTENT => false, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)); 我不确定使用什么驱动程序? 或者如何安装它们。 我可以使用PHP中的mssql_connect函数完全正确地连接,但是我想要使用PDO库。 请让我知道,如果你有一个想法如何解决我的问题,或者我怎么能更好地提出我的问题? 我的php.ini设置为mssql是: ssql MSSQL支持启用 活动持久链接0 活动链接1 库版本FreeTDS 指令本地价值主值 mssql.allow_persistent On On mssql.batchsize 0 0 mssql.charset没有值没有值 mssql.compatability_mode关关 mssql.connect_timeout 5 5 mssql.datetimeconvert打开 mssql.max_links无限制无限 mssql.max_persistent无限制无限制 mssql.max_procs无限制无限制 mssql.min_error_severity 10 10 mssql.min_message_severity 10 10 mssql.secure_connectionclosures mssql.textlimit服务器默认服务器默认 mssql.textsize服务器默认服务器默认 mssql.timeout 60 60 谢谢