English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

طريقة تنفيذ php لتحكم في قاعدة البيانات mysqli

بدأت دعم mysql(i) من php5.0، وأضيفت الميزات الجديدة بشكل موضوعي

i تعني تحسين، مع ميزات متعددة، كفاءة عالية، واستقرار

م 参数 في التجميع:

./configure --with-mysql=/usr/bin/mysql_config \ #بناء مكتبة ClientLibrary (libmysql) لمysql
--with-mysqli=mysqlnd \ #استخدام Driver الأصلي لمysqlnd
--with-pdo-mysql=mysqlnd #استخدام Driver الأصلي لمysqlnd

由于版权问题 从 php5.3开始 php开始用 mysqlnd 替代 libmysql.dll 
mysqlnd 是zend公司开发的mysql数据库驱动,相比原来各方面都有所提高

#使用mysqlnd编译

./configure --with-mysql=mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd 加上你的参数

mysqli 过程、对象方式都支持

mysqli提供的三个类:

1、mysqli 和连接相关的
2、MySQLi_Result 处理结果集
3、mysqli_stmt 预处理类

#设置字符集
set_charset

#获取字符集
character_set_name

获取数据库对象

//创建mysqli对象方式 1
//屏蔽连接产生的错误
$mysqli = new mysqli('127.0.0.1', 'root', '', 'test');
//يمكن استخدام الدالة فقط للتحقق من نجاح الاتصال
if(mysqli_connect_errno())
{
  echo mysqli_connect_error();
}
//创建mysqli对象方式 2 可以设置一些参数
$mysqli = mysqli_init();
$mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT, 2);//设置超时时间
$mysqli->real_connect('127.0.0.1', 'root', '', 'test'); 

query:失败返回false,select成功返回结果集对象,其他返回true 非false,意味着sql执行成功了

无结果集示例

$mysqli = mysqli_init();
$mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT, 2);//设置超时时间
$mysqli->real_connect('127.0.0.1', 'root', '', 'test');
$sql = "insert into limove(`name`, `order`) values('aa', 11)";
$rst = $mysqli->query($sql);
$sql = "delete from limove where id = 221";
$rst = $mysqli->query($sql);
if($rst === false)
{
  ee($mysqli->errno);
  ee($mysqli->error);
}
#影响条数
ee($mysqli->affected_rows);
#插入的id
ee($mysqli->insert_id);
ee($mysqli);

有结果集

$mysqli = mysqli_init();
$mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT, 2);//设置超时时间
$mysqli->real_connect('127.0.0.1', 'root', '', 'test');
$sql = "select * from limove as limove_as";
$result = $mysqli->query($sql);
if($result === false)
{
  ee($mysqli->errno);
  ee($mysqli->error);
}
#行数
ee($result->num_rows);
#列数
ee($result->field_count);
#字段个数
ee($result->field_count);
#获取所有字段的信息
$field_arr = $result->fetch_fields();
#移动字段的指针
// $result->field_seek(1);
#依次获取字段的信息
while($field = $result->fetch_field())
{
  ee($field);
}
#移动记录指针
$result->data_seek(1);
#一次获取所有数据
$data = $result->fetch_all(MYSQLI_ASSOC);
#关联数组方式获取结果集
$data = array();
$result->data_seek(0); #重置指针到起始
while($row = $result->fetch_assoc())
{
  $data[] = $row;
}
ee($data);
$result->free();
$mysqli->close();

一次 执行多条语句 multiquery (不推荐使用)

无结果集,此时 affected_rows 只能获取到最后的那条影响的条数

$mysqli = mysqli_init();
$mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT, 2);//设置超时时间
$mysqli->real_connect('127.0.0.1', 'root', '', 'test');
$sql_arr = array(
  'insert into limove(id,`name`, `order`) values(null, 1, 2)',    
  'insert into limove(id,`name`, `order`) values(null, 1, 222)',    
  'delete from limove where `order` = 2',    
);
$sql = implode(';', $sql_arr);
$result = $mysqli->multi_query($sql);
if($result === false)
{
  ee($mysqli->errno);
  ee($mysqli->error);
}
$mysqli->close();

有结果集

$mysqli = mysqli_init();
$mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT, 2);//设置超时时间
$mysqli->real_connect('127.0.0.1', 'root', '', 'test');
$sql_arr = array(
  'show tables',    
  'desc select * from limove',    
  'show create table limove',    
);
$sql = implode(';', $sql_arr);
$rst = $mysqli->multi_query($sql);
if($rst === false)
{
  ee($mysqli->errno);
  ee($mysqli->error);
}
do{
  $result = $mysqli->store_result();#获取当前光标所在的结果集
  $data = $result->fetch_all();
  ee($data);
}
$mysqli->close();

事务处理:

$mysqli=new mysqli("localhost", "root", "123456", "xsphpdb");
  //事务处理
  $mysqli->autocommit(0);
  $error=true;
  $price=50;
  $sql="update zh set ye=ye-{$price} where name='zhangsan'";
  $result=$mysqli->query($sql);
  if(!$result){
    $error=false;
    echo "从张三转出失败"
";
  }
    if($mysqli->affected_rows==0){
      $error=false;
      echo "张三的钱没有变化";  
    }
      echo "从张三账号中转出成功!"
";
    }
  }
  $sql="update zh set ye=ye+{$price} where name='lisi1'";
  $result=$mysqli->query($sql);
  if(!$result){
    $error=false;
    echo "从李四转入失败"
";
  }
    if($mysqli->affected_rows==0){
      $error=false;
      echo "李四的钱没有变化";  
    }
      echo "向李四账号中转入成功!"
";
    }
  }
  if($error){
    echo "转账成功!";
    $mysqli->commit();
  }
    echo "转账失败!";
    $mysqli->rollback();
  }
  $mysqli->autocommit(1);
  $mysqli->close();

mysqli_stmt:mysqli预处理类(推荐):表示了准备好的一个语句,服务器端只编译一次sql

用mysqli和mysqli_result可以实现同样的功能

优点:效率高,适用于语句相同只是数据不同的情况 ,可以阻止sql注入的产生

mysqli_stmt示例:非select语句

require 'fns.php';
//طريقة إنشاء كائن mysqli 
$mysqli = @new mysqli('127.0.0.1', 'root', '', 'test');
//يمكن استخدام الدالة فقط للتحقق من نجاح الاتصال
if(mysqli_connect_errno())
{
  echo mysqli_connect_error();
  die;
}
$mysqli->set_charset('utf8');
$sql = "insert into limove values(?, ?, ?)"; //语句一样值不相同情况
//mysqli中有直接的方法可用
$stmt = $mysqli->prepare($sql);
//ربط المعلمات
$stmt->bind_param('iss', $id, $name, $order);
for($i=0;$i<5;$i++){
  $id = 0;
  $name = 'name';
  $order = mt_rand(1, 1000);
  $stmt->execute();
}
//آخر id
ee($stmt->insert_id);
//عدد السطور المتأثرة ملاحظة: السطر الأخير الذي تم تنفيذه
ee($stmt->affected_rows);
//رقم الخطأ
ee($stmt->errno);
//رسالة الخطأ
ee($stmt->error);
//يمكن رؤية معلومات أكثر في كائن stmt
ee($stmt);
eee($mysqli);

mysqli_stmt مثال: جملة select 1 

require 'fns.php';
//طريقة إنشاء كائن mysqli 
$mysqli = @new mysqli('127.0.0.1', 'root', '', 'test');
//يمكن استخدام الدالة فقط للتحقق من نجاح الاتصال
if(mysqli_connect_errno())
{
  echo mysqli_connect_error();
  die;
}
$mysqli->set_charset('utf8');
$sql = "select * from limove where id

هذا المقال الذي يتناول كيفية تنفيذ php في قاعدة بيانات mysqli هو كل المحتوى الذي أشاركه معكم، آمل أن يكون مرجعًا جيدًا وأن يتلقى الجميع الدعم الكبير لتعليمات النفخ.

أنت قد تحب