Tag: 准备声明

我可以使用PDO准备语句绑定标识符(表或字段名称)或语法关键字吗?

我正在处理一个dynamic查询,它使用variables来指定表,字段/列和要search的值。 我已经得到的查询没有variables的预期工作,无论是在phpMyAdmin(手动键入查询),并从代码内通过将variables连接成一个完整的查询。 但是,当我使用bindParam()或bindValue()绑定variables时,它将返回一个空数组。 这是我的代码: function search_db($db, $searchTerm, $searchBy, $searchTable){ try{ $stmt = $db->prepare(' SELECT * FROM ? WHERE ? LIKE ? '); $stmt->bindParam(1, $searchTable); $stmt->bindParam(2, $searchBy); $stmt->bindValue(3, '%'. $searchTerm.'%'); $stmt->execute(); } catch(Exception $e) { return array(); } return $stmt->fetchAll(PDO::FETCH_ASSOC); } // database initialization, creates the $db variable require(ROOT_PATH . "include/database.php"); $matches = search_db($db, 'search term', […]

当*不*使用准备好的语句?

我正在重新devise一个使用最小数据库的PHP驱动的网站。 原始版本使用“伪准备语句”(引用和参数replace的PHP函数)来防止注入攻击并将数据库逻辑从页面逻辑中分离出来。 用一个使用PDO和真实准备好的语句的对象代替这些特定的函数似乎是很自然的,但是在我读完这些对象之后,我不太确定。 PDO似乎仍然是一个好主意,但准备好的陈述的主要卖点之一就是能够重用它们,这是我永远不会想到的。 这是我的设置: 这些陈述都非常简单。 大多数是在formsSELECT foo,bar FROM baz WHERE quux = ? ORDER BY bar LIMIT 1 SELECT foo,bar FROM baz WHERE quux = ? ORDER BY bar LIMIT 1 。 在这个地段最复杂的陈述只是三个这样的select联合在一起的UNION ALL 。 每个页面命中至多执行一个语句,并只执行一次。 我处于一个托pipe环境,因此对个人进行任何“压力testing”的抨击他们的服务器持怀疑态度。 鉴于使用准备好的语句,至less会使我所做的数据库往返次数增加一倍,我最好是避免它们? 我可以使用PDO::MYSQL_ATTR_DIRECT_QUERY避免多个数据库行程的开销,同时保留参数化和注入防御的好处吗? 或者,执行准备好的语句API使用的二进制调用与执行未准备好的查询相比,执行得还不错,我不应该担心这个问题呢? 编辑: 感谢所有的好build议,伙计们。 这是我希望我可以将多个答案标记为“已接受”的地方 – 有很多不同的观点。 但最终,我必须给予他应有的回报……如果没有他的回答,即使在听取了大家的意见后,我也会幸福地离开,完成了错误的事情。 🙂 仿真准备好的声明是!

在课堂上使用PDO

我有几个类执行一些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议一个优雅的方式做到这一点 谢谢你的时间。 抱歉,我是新手,如果您对任何事情不清楚,请留下您的意见,我会尽我所能来回应!

调用一个非对象PHP帮助的成员函数prepare()

我正在尝试编写一个PHP函数。 这很简单。 这只是一个查询数据库的准备语句,但我无法得到这个工作。 我不断收到错误调用一个非对象的成员函数prepare()。 这里是代码: $DBH = new mysqli("host", "test", "123456", "dbname"); function selectInfo($limit, $offset){ $stmt = $DBH->prepare("SELECT * FROM information LIMIT ?,?"); $stmt->bind_param("ii", $limit, $offset); $stmt->execute(); } selectInfo(); 任何时候我打电话的function,我得到这个错误。 有人可以帮忙吗?

调用一个非对象成员函数bind_param()

我想在这个准备好的语句中绑定一个variables,但是我一直收到错误: Call to a member function bind_param() on a non-object 该函数被调用,并将variables传递给它。 当我更改函数只是回显variables,variables打印在页面上罚款,但如果我尝试绑定在这里我收到错误。 谁能帮忙? //CALL FROM PAGE ONE check($username); //FUNCTION ON PAGE 2 function check($username){ $DBH = getDBH(); $qSelect = $DBH->prepare("SELECT * FROM users WHERE username = ?"); $qSelect->bind_param("s", $username); } 我知道这个函数并不完全写在这里,但是这不应该是一个问题。 我不明白为什么我收到这个错误。