在阅读一些SQL书时,我发现这些示例往往在查询中使用问号( ? )。 它代表什么?
我正在使用PostgreSQL的PHP PDO为一个新的项目。 鉴于以下function,我怎样才能返回刚刚插入的行的ID? 它现在看起来不行。 function adauga_administrator($detalii) { global $db; $ultima_logare = date('Ym-d'); $stmt = $db->prepare("INSERT INTO site_admins (sa_nume, sa_prenume, sa_user_name, sa_password, sa_email, sa_id_rol, sa_status, sa_ultima_logare) VALUES (?, ?, ?, ?, ?, ?, ?, ?)"); $stmt->bindParam(1, $detalii['nume']); $stmt->bindParam(2, $detalii['prenume']); $stmt->bindParam(3, $detalii['username']); $stmt->bindParam(4, md5(md5($detalii['parola'] . SIGURANTA_PAROLE) . SIGURANTA_PAROLE)); $stmt->bindParam(5, $detalii['email']); $stmt->bindParam(6, $detalii['rol'], PDO::PARAM_INT); $stmt->bindParam(7, $detalii['status'], PDO::PARAM_INT); $stmt->bindParam(8, […]
所以我一直听说PreparedStatements对性能有好处。 我们有一个Java应用程序,在这个应用程序中我们使用常规的“Statement”比使用“PreparedStatement”更多。 在尝试使用更多的PreparedStatements的同时,我正在尝试更全面地了解PreparedStatements如何工作 – 在客户端和服务器端。 因此,如果我们有一些典型的CRUD操作并在应用程序中重复更新对象,是否有助于使用PS? 我明白,我们将不得不每次closuresPS,否则会导致游标泄漏。 那么它对性能有什么帮助? 是否驱动caching预编译语句,并给我一个副本,下一次我做connection.prepareStatement? 还是DB服务器有帮助? 我理解有关PreparedStatements的安全性好处的争论,我赞赏下面强调它的答案。 不过,我真的希望继续关注PreparedStatements的性能优势。 更新:当我说更新数据时,我真的更多的是随机地多次调用这个方法。 我理解下面提供的答案中的优点,要求在循环中重新使用语句。 // some code blah blah update(); // some more code blah blah update(); …. public void update () throws SQLException{ try{ PreparedStatement ps = connection.prepareStatement("some sql"); ps.setString(1, "foobar1"); ps.setString(2, "foobar2"); ps.execute(); }finally { ps.close(); } } 没有办法真正重用'ps'java对象,我明白,实际的connection.prepareStatement调用是相当昂贵的。 这是什么使我回到原来的问题。 这是“一些SQL”的PreparedStatement仍然被caching和重用,我不知道的封面? 我还要提到,我们支持几个数据库。 提前致谢。
有没有办法从一个数据库查询检索自动生成的密钥时使用Java语句与准备语句。 例如,我知道AutoGeneratedKeys可以工作如下。 stmt = conn.createStatement(); stmt.executeUpdate(sql, Statement.RETURN_GENERATED_KEYS); if(returnLastInsertId) { ResultSet rs = stmt.getGeneratedKeys(); rs.next(); auto_id = rs.getInt(1); } 然而。 如果我想用一个准备好的语句做一个插入操作。 String sql = "INSERT INTO table (column1, column2) values(?, ?)"; stmt = conn.prepareStatement(sql); //this is an error stmt.executeUpdate(Statement.RETURN_GENERATED_KEYS); if(returnLastInsertId) { //this is an error since the above is an error ResultSet rs = stmt.getGeneratedKeys(); rs.next(); […]
我想知道是什么bindParam() (或bindValue() )中的数据types的声明用于… 我的意思是,我认为,如果我定义一个整数参数( PDO::PARAM_INT ),参数必须转换为一个整数,类似 $delete->bindParam(1, $kill, PDO::PARAM_INT); // should work like $delete->bindParam(1, (int)$kill); 或者如果参数不是声明的types,至less会抛出一个错误。 但事实并非如此。 谷歌search,我发现在php.net的档案: 大家好, 我目前正在研究PDO。 完全在bindParam()函数上。 第三个参数data_type似乎是在这里强制的值的types? 但是当我尝试: $sql = "INSERT INTO produit (idproduit, nom, marque) VALUES (NULL, :nom, :marque)"; $stmt = $dbh->prepare($sql); $nom = 'Testarossa'; $marque = 'Ferrari' ; $stmt->BindValue(':marque',$marque) ; $stmt->BindParam(':nom',$nom,PDO::PARAM_INT) ; $stmt->execute(); $nom = '250 GTO' ; […]
我知道使用PreparedStatement的好处, 查询由数据库服务器重写和编译 防止SQL注入 但是我想知道什么时候用它来代替Statement ?
我已阅读并尝试将易受攻击的SQL查询注入到我的应用程序中。 这是不够安全的。 我只是使用语句连接进行数据库validation和其他插入操作。 preparedStatements安全吗? 而且这个说法也会有什么问题吗?
我有一个应用程序,这将大大有益于通过使用dynamicmysql查询结合mysql(mysqli)真正的转义string。 如果我运行从用户收到的所有数据通过MySQL真正的逃生会像使用MySQL准备语句一样安全?
我一直做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 /准备语句是一种更安全的方式来存储和检索数据库中的数据。 唯一的问题是,切换(特别是在被困在我以前的编码习惯之后)有点困难。 […]
有些人认为mysql_real_escape_string()有一些缺陷,即使正确使用,也不能保护你的查询。 带来一些化石的文章作为certificate。 所以,问题是:mysql [i] _real escape_string()完全不可接受? 还是可以使用这个函数来创build自己的准备好的语句? 请用校对码。