GVKun编程网logo

php – prepare()vs query()mysqli

6

这篇文章主要围绕php–prepare()vsquery()mysqli展开,旨在为您提供一份详细的参考资料。我们将全面介绍php–prepare()vsquery()mysqli,同时也会为您带来M

这篇文章主要围绕php – prepare()vs query()mysqli展开,旨在为您提供一份详细的参考资料。我们将全面介绍php – prepare()vs query()mysqli,同时也会为您带来MySQL prepare语句的SQL语法_MySQL、mysql 执行存储过程报错 Prepared statement needs to be re-prepared、mysqli_query() 和 & mysqli_fetch_array() mysqli_result,期望参数 1 为空、Mysql实例PHP5 mysqli的prepare准备语句使用说明的实用方法。

本文目录一览:

php – prepare()vs query()mysqli

php – prepare()vs query()mysqli

我试图理解mysqli的query()和prepare()之间的区别.我有类似下面的代码,我想从两者得到相同的结果.但是,prepare()不能按预期工作.为什么?

  // this works

  if ($query = $this->db->query("SELECT html FROM static_pages WHERE page = 'cities'")) {

     $result = $query->fetch_row();
     echo $result[0];

  $query->close();

  }

  //this does not work
  //result is empty

     $cities = 'cities';

     $stmt = $this->db->prepare("SELECT html FROM static_pages WHERE page = ?");
     $stmt -> bind_param("s",$cities);
     $stmt->execute();
     $stmt->bind_result($result);
     $stmt->fetch();
     echo $result;
     $stmt->close();

     $this->db->close();

这些是我的服务器配置按要求:

OS

Vista 64bit / PHP版本5.2.9

MysqLi的

启用了MysqLI支持

客户端API库版本5.0.51a

客户端API标头版本5.0.51a

MysqLI_SOCKET /tmp/MysqL.sock

指令本地价值主值

MysqLi.default_host没有值没有值

MysqLi.default_port 3306 3306

MysqLi.default_pw没有值没有值

MysqLi.default_socket没有值没有值

MysqLi.default_user没有值没有值

MysqLi.max_links无限无限

MysqLi.reconnect关闭

最佳答案
你能试试$stmt-> store_result(); $stmt-> execute();之间和$stmt-> bind_result($result); ?

MySQL prepare语句的SQL语法_MySQL

MySQL prepare语句的SQL语法_MySQL

bitscn.com

MySQL prepare语法:

PREPARE statement_name FROM preparable_SQL_statement; /*定义*/

EXECUTE statement_name [USING @var_name [, @var_name] ...]; /*执行预处理语句*/

{DEALLOCATE | DROP} PREPARE statement_name /*删除定义*/ ;

PREPARE语句用于预备一个语句,并指定名称statement_name,以后引用该语句。语句名称对大小写不敏感。preparable_stmt可以是一个文字字符串,也可以是一个包含了语句文本的用户变量。该文本必须表现为一个单一的SQL语句,而不是多个语句。在这语句里,‘?’字符可以被用于标识参数,当执行时,以指示数据值绑定到查询后。‘?’字符不应加引号,即使你想要把它们与字符串值结合在一起。参数标记只能用于数据值应该出现的地方,而不是SQL关键字,标识符,等等。

如果预语句已经存在,则在新的预语句被定义前,它会被隐含地删掉。

例如:

mysql> prepare optimize_tables from "optimize table temp";
Query OK, 0 rows affected (0.00 sec)Statement prepared
mysql> execute optimize_tables;
+-----------+----------+----------+----------+
| Table     | Op       | Msg_type | Msg_text |
+-----------+----------+----------+----------+
| test.temp | optimize | status   | OK       | 
+-----------+----------+----------+----------+
1 row in set (0.37 sec)
mysql> deallocate prepare optimize_tables;Query OK, 0 rows affected (0.00 sec)
--------------------------------------------------------------------------
mysql> prepare md5sum from 'select md5(?) AS md5sum';
Query OK, 0 rows affected (0.00 sec)Statement prepared
mysql> set @a=111;Query OK, 0 rows affected (0.00 sec)
mysql> set @b=222;Query OK, 0 rows affected (0.00 sec)
mysql> execute md5sum using @a;
+----------------------------------+
| md5sum                           |
+----------------------------------+
| 698d51a19d8a121ce581499d7b701668 | 
+----------------------------------+
1 row in set (0.00 sec)
mysql> execute md5sum using @b;
+----------------------------------+
| md5sum                           |
+----------------------------------+
| bcbe3365e6ac95ea2c0343a2395834dd | 
+----------------------------------+1 row in set (0.00 sec)
mysql> drop prepare md5sum;Query OK, 0 rows affected (0.00 sec)
--------------------------------------------------------------------------------------
mysql> prepare update_table from "update users set password=password('aaa') where username='a'";
Query OK, 0 rows affected (0.00 sec)Statement prepared
mysql> execute update_table;Query OK, 0 rows affected (0.00 sec)Rows matched: 1 
Changed: 0 Warnings: 0
mysql> deallocate prepare update_table;Query OK, 0 rows affected (0.00 sec)
登录后复制

从MySQL 5.0 开始,支持了一个全新的SQL句法:

PREPARE stmt_name FROM preparable_stmt;
EXECUTE stmt_name [USING @var_name [, @var_name] ...];
{DEALLOCATE | DROP} PREPARE stmt_name;
登录后复制

通过它,我们就可以实现类似 MS SQL 的 sp_executesql 执行动态SQL语句!

同时也可以防止注入式攻击!

为了有一个感性的认识,

下面先给几个小例子:

mysql> PREPARE stmt1 FROM 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
mysql> SET @a = 3;
mysql> SET @b = 4;
mysql> EXECUTE stmt1 USING @a, @b;
+------------+
| hypotenuse |
+------------+
 
| 5 |
+------------+
mysql> DEALLOCATE PREPARE stmt1;
mysql> SET @s = 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
 mysql> PREPARE stmt2 FROM @s;
mysql> SET @a = 6;
mysql> SET @b = 8;
mysql> EXECUTE stmt2 USING @a, @b;
+------------+
| hypotenuse |
+------------+
| 10 |
+------------+
mysql> DEALLOCATE PREPARE stmt2;
登录后复制

如果你的MySQL 版本是 5.0.7 或者更高的,你还可以在 LIMIT 子句中使用它,示例如下:mysql> SET @a=1;mysql>

PREPARE STMT FROM "SELECT * FROM tbl LIMIT ?"; mysql> EXECUTE STMT USING @a;
mysql> SET @skip=1; SET @numrows=5; phperz.com
mysql> PREPARE STMT FROM "SELECT * FROM tbl LIMIT ?, ?";
登录后复制


mysql> EXECUTE STMT USING @skip, @numrows; 使用 PREPARE 的几个注意点:

A:PREPARE stmt_name FROM preparable_stmt;


预定义一个语句,并将它赋给 stmt_name ,stmt_name 是不区分大小写的。

B: 即使 preparable_stmt 语句中的 ? 所代表的是一个字符串,你也不需要将 ? 用引号包含起来。

C: 如果新的 PREPARE 语句使用了一个已存在的 stmt_name ,那么原有的将被立即释放! 即使这个新的 PREPARE 语句因为错误而不能被正确执行。

D: PREPARE stmt_name 的作用域是当前客户端连接会话可见。

E: 要释放一个预定义语句的资源,可以使用 DEALLOCATE PREPARE 句法。

F: EXECUTE stmt_name 句法中,如果 stmt_name 不存在,将会引发一个错误。

G: 如果在终止客户端连接会话时,没有显式地调用 DEALLOCATE PREPARE 句法释放资源,服务器端会自己动释放它。

H: 在预定义语句中,CREATE TABLE, DELETE, DO, INSERT, REPLACE, SELECT, SET, UPDATE, 和大部分的 SHOW 句法被支持。

G: PREPARE 语句不可以用于存储过程,自定义函数!但从 MySQL 5.0.13 开始,它可以被用于存储过程,仍不支持在函数中使用! 下面给个示例:

 CREATE PROCEDURE `p1`(IN id INT UNSIGNED,IN name VARCHAR(11))BEGIN lable_exit: BEGIN SET 
 @SqlCmd = 'SELECT * FROM tA '; IF id IS NOT NULL THEN SET @SqlCmd = CONCAT(@SqlCmd , 'WHERE id=?'); 
 PREPARE stmt FROM @SqlCmd; SET @a = id; EXECUTE stmt USING @a; LEAVE lable_exit; END IF; 
 IF name IS NOT NULL THEN SET @SqlCmd = CONCAT(@SqlCmd , 'WHERE name LIKE ?'); 
 PREPARE stmt FROM @SqlCmd; SET @a = CONCAT(name, '%'); EXECUTE stmt USING @a; LEAVE lable_exit; END IF; 
 END lable_exit;END; CALL `p1`(1,NULL);CALL `p1`(NULL,'QQ');DROP PROCEDURE `p1`;
登录后复制

声明 此为转载

 以上就是MySQL prepare语句的SQL语法_MySQL的内容。

mysql 执行存储过程报错 Prepared statement needs to be re-prepared

mysql 执行存储过程报错 Prepared statement needs to be re-prepared

今日思语:不喜欢再见 说再见,因为有时明知道下一次再见已是遥遥无期或是不再见

 

错误如下

ERROR 1615 (HY000) at line 406 in file: ''update-mysql.sql'': Prepared statement needs to be re-prepared

这个地方是执行了调用一个存储过程。解决方式是重设了 mysql 的两个缓存大小变量的值,如下:

  • table_open_cache: 表高速缓存的大小
  • table_definition_cache:表定义信息缓存

查看这 2 个配置变量值:

SHOW VARIABLES LIKE ''%table_open_cache%'';

SHOW VARIABLES LIKE ''%table_definition_cache%'';

重新设置当前值的大小

mysql> set global table_open_cache=16384;
mysql> set global table_definition_cache=16384;

设置完之后可以再查看一下变量值。

之后重新执行调用了存储过程的脚本文件就好了。

 

mysqli_query() 和 & mysqli_fetch_array() mysqli_result,期望参数 1 为空

mysqli_query() 和 & mysqli_fetch_array() mysqli_result,期望参数 1 为空

如何解决mysqli_query() 和 & mysqli_fetch_array() mysqli_result,期望参数 1 为空?

警告:MysqLi_query() 期望参数 1 为 MysqLi,第 101 行 C:\xampp\path\products.PHP 中给出的 null

警告:MysqLi_fetch_array() 期望参数 1 为 MysqLi_result,第 10 行 C:\xampp\path\products.PHP 中给出的 null

数据连接文件

 <?PHP
  $conn = MysqLi_connect("localhost","root","","mystore");
    
 if($conn){
  //echo "Database has been configured.";
   }
  else{
  echo "You have no connection with database";
  } 
    

查询文件(products.PHP)

 <th>Sr#</th>
 <th>Product Name</th>
  <th>Product Desc</th>
 <th>Product Price</th>
 <th>View | Update | Delete</th>
   </tr>
  </thead>
   <tbody>
  <?PHP
   $i = 0;
  $query = "select * from products";
   $run = MysqLi_query($conn,$query);
   while($row = MysqLi_fetch_array($run)){
  $i++;
  ?>
  <tr>
   <td><?PHP echo $i; ?></td>
   <td><?PHP echo $row[''product_name'']; ?></td>
    <td><?PHP echo $row[''product_desc'']; ?></td>
   <td><?PHP echo $row[''product_price'']; ?></td>
     <td></td>
   <?PHP } ?>
   </tbody>
    </table>
    

在上面提到的代码行中包含两个单独的文件。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

Mysql实例PHP5 mysqli的prepare准备语句使用说明

Mysql实例PHP5 mysqli的prepare准备语句使用说明

《MysqL实例PHP5 MysqLi的prepare准备语句使用说明》要点:
本文介绍了MysqL实例PHP5 MysqLi的prepare准备语句使用说明,希望对您有用。如果有疑问,可以联系我们。

MysqL实例MysqLi对prepare的支持对于大访问量的网站是很有好处的,它极大地降低了系统开销,而且保证了创建查询的稳定性和安全性.prepare准备语句分为绑定参数和绑定结果,下面将会一一介绍!
(1)绑定参数
看下面PHP代码:

代码如下:

<?PHP
//创建连接
$MysqLi=new MysqLi("localhost","root","","volunteer");
//检查连接是否被创建
if (MysqLi_connect_errno()) {
printf("Connect Failed: %s\n",MysqLi_connect_error());
exit();
}
/*
* 创建一个准备查询语句:
* ?是个通配符,可以用在任何有文字的数据
* 相当于一个模板,也就是预备sql语句
*/
if ($stmt = $MysqLi->prepare("insert into `vol_msg`(mid,content) values(?,?)")){
/*第一个参数是绑定类型,"s"是指一个字符串,也可以是"i",指的是int.也可以是"db",
* d代表双精度以及浮点类型,而b代表blob类型,第二个参数是变量
*/
$stmt->bind_param("is",$id,$content);
//给变量赋值
$id = "";
$content = "这是插入的内容";
//执行准备语句
$stmt->execute();
//显示插入的语句
echo "Row inserted".$stmt->affected_rows;
//下面还可以继续添加多条语句,不需要prepare预编译了
//关闭数据库的链接
$MysqLi->close();
}
?>

以上PHP实例运行结果:
Row inserted:1
(2).绑定结果:绑定结果就是将你绑定的字段给PHP变量,以便必要时使用这些变量
请看下面的PHP代码:
代码如下:

<?PHP
//创建连接
$MysqLi=new MysqLi("localhost","volunteer");
//设置MysqLi编码
MysqLi_query($MysqLi,"SET NAMES utf8");
//检查连接是否被创建
if (MysqLi_connect_errno()) {
printf("Connect Failed: %s\n",MysqLi_connect_error());
exit();
}
//创建准备语句
if ($stmt = $MysqLi->prepare("select mid,content from `vol_msg`")){
//执行查询
$stmt->execute();
//为准备语句绑定实际变量
$stmt->bind_result($id,$content);
//显示绑定结果的变量
while($stmt->fetch()){
echo "第".$id."条: ".$content."<br />";
}
//关闭数据库的链接
$MysqLi->close();
}
?>

今天关于php – prepare()vs query()mysqli的讲解已经结束,谢谢您的阅读,如果想了解更多关于MySQL prepare语句的SQL语法_MySQL、mysql 执行存储过程报错 Prepared statement needs to be re-prepared、mysqli_query() 和 & mysqli_fetch_array() mysqli_result,期望参数 1 为空、Mysql实例PHP5 mysqli的prepare准备语句使用说明的相关知识,请在本站搜索。

本文标签:

上一篇php – 优化此查询,从具有500.000个用户和一个条件的MySQL数据库中检索用户

下一篇php – Mysql如何在数据库中将时间数据类型设置为只有HH:MM(mysql中时间类型的默认值怎么写)