这篇文章主要围绕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
- 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
我试图理解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关闭
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
今日思语:不喜欢再见 说再见,因为有时明知道下一次再见已是遥遥无期或是不再见
错误如下:
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() 期望参数 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实例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();
}
?>