• 关于 MySQLi查询操作 的搜索结果

回答

详细解答可以参考官方帮助文档 一、MySQL与mysqli相关概念:1. MySQL与mysqli都是php方面的函数集,与MySQL数据库关联不大。2. 在php5版本之前,一般是用php的MySQL函数去驱动MySQL数据库的,比如mysql_query()函数,属于面向过程。3.在php5版本以后,增加了mysqli的函数功能,某种意义上讲,它是MySQL系统函数的增强版,更稳定更高效更安全,与mysql_query()对应的有mysqli_query(),属于面向对象,用对象的方式操作驱动MySQL数据库。二、MySQL与mysqli区别:1. MySQL是非持继连接函数,MySQL每次链接都会打开一个连接的进程。2. mysqli是永远连接函数,mysqli多次运行mysqli将使用同一连接进程,从而减少了服务器的开销。mysqli封装了诸如事务等一些高级操作,同时封装了DB操作过程中的很多可用的方法。三、MySQL与mysqli用法:1、 MySQL(过程方式):$conn = mysql_connect(‘localhost’, ‘user’, ‘password’); //连接mysql数据库  mysql_select_db(‘data_base’);  //选择数据库  $result = mysql_query(‘select from data_base’);//第二个可选参数,指定打开的连接  $row = mysql_fetch_row( $result ) ) //只取一行数据  echo $row[0]; //输出第一个字段的值  mysqli以过程式的方式操作,有些函数必须指定资源,比如mysqli_query(资源标识,SQL语句),并且资源标识的参数是放在前面的,而mysql_query(SQL语句,’资源标识’)的资源标识是可选的,默认值是上一个打开的连接或资源。2.mysqli(对象方式):  $conn = new mysqli(‘localhost’, ‘user’, ‘password’,’data_base’);  //要使用new操作符,最后一个参数是直接指定数据库  //假如构造时候不指定,那下一句需要$conn -> select_db(‘data_base’)实现  $result = $conn -> query( ‘select from data_base’ );  $row = $result -> fetch_row(); //取一行数据  echo row[0]; //输出第一个字段的值使用new mysqli(‘localhost’, usenamer’, ‘password’, ‘databasename’);会报错,提示如下:Fatal error: Class ‘mysqli’ not found in …一般是mysqli是没有开启的,因为mysqli类不是默认开启的,win下要改php.ini,去掉php_mysqli.dll前的;,linux下要把mysqli编译进去。四、mysql_connect()与mysqli_connect()1.使用mysqli,可以把数据库名称当作参数传给mysqli_connect()函数,也可以传递给mysqli的构造函数;2.如果调用mysqli_query()或mysqli的对象查询query()方法,则连接标识是必需的。如果问题还未能解决,请联系售后技术支持。

2019-12-01 23:21:03 0 浏览量 回答数 0

回答

查询可能由于各种原因而失败,在这种情况下,mysql_ *和mysqli扩展名都false将从它们各自的查询函数/方法中返回。您需要测试该错误情况并进行相应处理。 mysql_ *扩展名: 注:该mysql_功能已被弃用,并在PHP版本7已被删除。 请先检查一下,$result然后再传递给mysql_fetch_array。您会发现这是false因为查询失败。请参阅mysql_query文档以获取可能的返回值以及有关如何处理它们的建议。 $username = mysql_real_escape_string($_POST['username']); $password = $_POST['password']; $result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '$username'"); if($result === FALSE) { die(mysql_error()); // TODO: better error handling } while($row = mysql_fetch_array($result)) { echo $row['FirstName']; } mysqli扩展 程序样式: $username = mysqli_real_escape_string($mysqli, $_POST['username']); $result = mysqli_query($mysqli, "SELECT * FROM Users WHERE UserName LIKE '$username'"); // mysqli_query returns false if something went wrong with the query if($result === FALSE) { yourErrorHandler(mysqli_error($mysqli)); } else { // as of php 5.4 mysqli_result implements Traversable, so you can use it with foreach foreach( $result as $row ) { ... oo风格: $username = $mysqli->escape_string($_POST['username']); $result = $mysqli->query("SELECT * FROM Users WHERE UserName LIKE '$username'"); if($result === FALSE) { yourErrorHandler($mysqli->error); // or $mysqli->error_list } else { // as of php 5.4 mysqli_result implements Traversable, so you can use it with foreach foreach( $result as $row ) { ... 使用准备好的语句: $stmt = $mysqli->prepare('SELECT * FROM Users WHERE UserName LIKE ?'); if ( !$stmt ) { yourErrorHandler($mysqli->error); // or $mysqli->error_list } else if ( !$stmt->bind_param('s', $_POST['username']) ) { yourErrorHandler($stmt->error); // or $stmt->error_list } else if ( !$stmt->execute() ) { yourErrorHandler($stmt->error); // or $stmt->error_list } else { $result = $stmt->get_result(); // as of php 5.4 mysqli_result implements Traversable, so you can use it with foreach foreach( $result as $row ) { ... 这些示例仅说明了应该执行的操作(错误处理),而没有说明如何执行。or die输出HTML时不应使用生产代码,否则它将(至少)生成无效的HTML。另外,数据库错误消息不应显示给非管理员用户,因为它会显示过多信息。

保持可爱mmm 2020-05-08 11:02:57 0 浏览量 回答数 0

回答

您有几种选择方法,可COUNT(*)从SQL 获取值。最简单的三个可能是: $sql = "SELECT COUNT(*) FROM news"; $result = mysqli_query($con, $sql); $count = mysqli_fetch_assoc($result)['COUNT(*)']; echo $count; 或使用列别名: $sql = "SELECT COUNT(*) as cnt FROM news"; $result = mysqli_query($con, $sql); $count = mysqli_fetch_assoc($result)['cnt']; echo $count; 或使用数值数组: $sql = "SELECT COUNT(*) FROM news"; $result = mysqli_query($con, $sql); $count = mysqli_fetch_row($result)[0]; echo $count; 不要使用mysqli_num_rows网络上某些地方建议的对数据库中的记录进行计数。此功能使用很少,计数记录绝对不是其中之一。使用mysqli_num_rows您将要求MySQL 从数据库中检索所有匹配的记录,这可能会非常消耗资源。最好将计数记录的工作委托给MySQL,然后如我的答案所示,仅获取PHP中的返回值。 我还建议您学习OOP,这会使您的代码更整洁,更易于阅读。与OOP相同,可以执行以下操作: $sql = "SELECT COUNT(*) FROM news"; $count = $con->query($sql)->fetch_row()[0]; echo $count; 如果查询使用变量,则可以执行类似的操作,但要使用准备好的语句。 $sql = "SELECT COUNT(*) FROM news WHERE category=?"; $stmt = $con->prepare($sql); $stmt->bind_param('s', $category); $stmt->execute(); $count = $stmt->get_result()->fetch_row()[0]; echo $count;来源:stack overflow

保持可爱mmm 2020-05-11 16:26:51 0 浏览量 回答数 0

试用中心

为您提供0门槛上云实践机会,企业用户最高免费12个月

问题

MySQLi准备的语句错误报告

保持可爱mmm 2020-05-10 20:57:52 0 浏览量 回答数 1

回答

php也确实推荐过不要使用mysql_xx来连接MySQL数据库。推荐PDO、MySQLi来连接管理MySQL。PDO扩展为PHP访问数据库定义了一个轻量级的、一致性的接口,它提供了一个数据访问抽象层,这样,无论你使用什么数据库,你都可以通过一致的函数执行查询和获取数据。注意,你并不能使用PDO扩展本身执行任何数据库操作,你必须使用一个database-specific PDO driver(针对特定数据库的PDO驱动)访问数据库服务器。PDO并不提供数据库抽象,它并不会重写SQL或提供数据库本身缺失的功能,如果你需要这种功能,你需要使用一个更加成熟的抽象层。PDO随PHP5.1发行,在PHP5.0的PECL扩展中也可以使用。PDO需要PHP5核心OO特性的支持,所以它无法运行于之前的PHP版本。mysqli是PHP对mysql新特性的一个扩展支持。在PHP5中可以在php.ini中加载mysql后面的i,指improved, interface, ingenious, incompatible or incomplete-可以和mysql_xxxx一样的方式使用-支持OO接口,简简单单调用-支持MYSQL4。1引入的新特性-通过mysqli_init() 等相关函数,可以设置高级连接选项

蛮大人123 2019-12-02 01:43:35 0 浏览量 回答数 0

回答

我只想提供有关vartec提出的解决方案的更多详细信息,这是(取决于您的MySQL安装)最适合您的问题的解决方案。首先,MySQL中的字符集/编码问题是一个有点复杂的主题,MySQL手册第9.1章“字符集支持”对此进行了广泛讨论。在您的情况下,尤其是9.1.4。“连接字符集和排序规则”将是最相关的。 简而言之:MySQL必须知道客户端应用程序期望使用哪种字符集/编码(从与您的PHP脚本进行数据库渗透性交谈),因为它将对服务器端定义的内部字符集/编码中的所有字符串数据进行转码,数据库,表或列级别转换为连接字符集/编码。您在客户端使用UTF-8,因此必须告诉MySQL您使用UTF-8。这是通过MySQL命令完成的,该命令SET NAMES 'utf8'必须在打开连接时作为第一个查询发送。取决于您的安装和在PHP脚本中使用的MySQL客户端库,可以在每次连接时自动完成此操作。 如果使用PDO,则只需设置配置参数即可 $db = new PDO($dsn, $user, $password); $db->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, "SET NAMES 'utf8'"); 使用mysqli更改客户端字符集/编码更加简单: $mysqli = new mysqli("localhost", "user", "password", "db"); $mysqli->set_charset("utf8"); 我希望这将有助于使整个事情更容易理解。来源:stack overflow

保持可爱mmm 2020-05-18 11:12:18 0 浏览量 回答数 0

问题

为什么使用mysql预处理语句比使用普通转义功能更安全?

保持可爱mmm 2020-05-11 16:56:55 0 浏览量 回答数 1

回答

以下代码仅声明了一个包含MySQL查询的字符串变量: $sql = "INSERT INTO users (username, password, email) VALUES ('".$_POST["username"]."','".$_POST["password"]."','".$_POST["email"]."')"; 它不执行查询。为此,您需要使用一些功能,但让我先解释一下。 永远不要信任用户输入:永远不要将用户输入(例如来自$_GET或的表单输入$_POST)直接附加到查询中。有人可以以这种方式小心地操作输入,以免对您的数据库造成严重损害。这就是所谓的SQL注入。您可以在这里了解更多信息 为了保护脚本免受此类攻击,您必须使用“预处理语句”。有关准备好的声明的更多信息,请点击此处 将准备好的语句包括在您的代码中,如下所示: $sql = "INSERT INTO users (username, password, email) VALUES (?,?,?)"; 注意如何将?用作值的占位符。接下来,您应该使用mysqli_prepare以下语句准备语句: $stmt = mysqli_prepare($sql); 然后开始将输入变量绑定到准备好的语句: $stmt->bind_param("sss", $_POST['username'], $_POST['email'], $_POST['password']); 最后执行准备好的语句。(这是实际插入的地方) $stmt->execute(); 注意尽管不是问题的一部分,但我强烈建议您不要以明文形式存储密码。相反,您应该使用password_hash存储密码的哈希值来源:stack overflow

保持可爱mmm 2020-05-11 16:43:24 0 浏览量 回答数 0

回答

开源Web应用最常见漏洞和防御方法:1.XSS(跨站脚本攻击):htmlspecialchars/HTMLPurifier过滤后输出2.SQL注入:预处理参数化查询3.远程和本地文件包含漏洞:allow_url_fopen=On(默认值)include($_GET['file']);这样做是危险的.4.跨站请求伪造CSRF:操作加上csrf_token或者验证码(csrf_token可以放在URL的get参数里,表单的隐藏域里,或者AJAX的参数里)5.远程命令执行(RCE)命令注入 xss和注入的防御思路完全不一样 另外楼主的方案至少是10年以前的,早已落伍 对于注入,使用PDO或者mysqli的prepare方式来解决 对于XSS,请使用#<spanstyle="font-family:Verdana,sans-serif,宋体;font-size:13.3333px;line-height:21.3333px;background-color:#FFFFFF;">HTMLPurifier# 不拼接sql不完了吗?过滤毛线啊有时拼SQL也无妨,比如:var_export($db->query('SELECT*FROMlogsWHEREid='.intval($_GET['id']))->fetchAll(PDO::FETCH_ASSOC));用intval把用户输入强制转整数即可.

爱吃鱼的程序员 2020-06-09 13:41:40 0 浏览量 回答数 0

回答

绝对没有 虽然标题中的问题是模棱两可的,可以解释为“动态mysql查询的每个部分格式是否正确……”,因此有肯定的答案,但正文中的问题不是: 如果我运行了通过mysql真正的转义从用户那里收到的所有数据,那么它与使用mysql预准备语句一样安全吗? 如果您更仔细地看这个问题,您将理解,这只是魔术引述的化身!此不受欢迎,不推荐使用和已删除的功能的确切目的是“通过转义运行所有用户输入”。 如今,每个人都知道魔术引号是不好的。那为什么要肯定的答案呢? 好的,似乎需要再次解释,为什么批量转义不好。 问题的根源是一个非常强烈的妄想,几乎每个PHP用户 都对它抱有幻想:每个人都有一个奇怪的信念,即逃避对“危险字符”(它们是什么?)进行某些操作,使它们“安全”(如何?)。不用说,这只是一个完整的垃圾。 事实是: 逃逸不会“消毒”任何东西。 逃逸与注射无关。 转义与用户输入无关。 转义只是一种字符串格式而已。 当需要时-尽管有注射的可能,但仍需要它。 当您不需要它时,即使有一点注射也无济于事。 说到与准备好的语句的区别,至少存在一个问题(在sql-injection标记下已经多次提及):这样 的代码 $clean = mysql_real_escape_string($_POST['some_dangerous_variable']); $query = "SELECT * FROM someTable WHERE somevalue = $clean"; 将帮助您避免注射。 Beause转义只是字符串格式化工具,无论如何都不是防止注入的工具。 去搞清楚。 但是,转义与准备好的语句有一些共同点: 如果发生以下情况,它们都不能保证您不会被注入 您仅在臭名昭著的“用户输入”上使用它,而不管构建ANY查询的严格规则,尽管有数据源。 如果您需要插入的不是数据,而是标识符或关键字。 为了安全起见,请参阅我的答案,以解释FULL sql注入保护的操作方法 长话短说:只有在您对初始陈述进行2次必要的更正和1次补充之后,您才能认为自己是安全的: 如果我运行了通过mysql真正的转义从用户那里收到的所有数据,并且始终将其括在引号中(并且,如ircmaxell所提到的,mysqli_set_charset()它用于使mysqli_real_escape string()实际上起作用了(在这种罕见的情况下,使用一些奇怪的编码,例如GBK))是否与使用mysql准备好的语句一样安全? 遵循这些规则-是的,它与本地准备好的语句一样安全。来源:stack overflow

保持可爱mmm 2020-05-18 11:12:10 0 浏览量 回答数 0

回答

数据存储: utf8mb4在数据库的所有表和文本列上指定字符集。这使得MySQL在物理上存储和检索以UTF-8本地编码的值。注意,utf8mb4如果utf8mb4_*指定了排序规则(没有任何显式字符集),MySQL将隐式使用编码。 在旧版本的MySQL(<5.5.3)中,不幸的是,您将被迫utf8仅使用,仅支持Unicode字符的一部分。我希望我在开玩笑。 资料存取: 在您的应用程序代码(例如PHP)中,无论使用哪种数据库访问方法,都需要将连接字符集设置为utf8mb4。这样,当MySQL将数据交给您的应用程序时,MySQL不会从其本地UTF-8进行转换,反之亦然。 一些驱动程序提供了自己的配置连接字符集的机制,该机制既可以更新其自身的内部状态,又可以将要在连接上使用的编码通知MySQL-这通常是首选方法。在PHP中: 如果您使用PHP≥5.3.6的PDO抽象层,则可以charset在DSN中指定: $dbh = new PDO('mysql:charset=utf8mb4'); 如果您使用的是mysqli,则可以调用set_charset(): $mysqli->set_charset('utf8mb4'); // object oriented style mysqli_set_charset($link, 'utf8mb4'); // procedural style 如果您坚持使用普通的mysql,但碰巧正在运行PHP≥5.2.3,则可以致电mysql_set_charset。 如果驱动程序不提供自己的设置连接字符集的机制,则可能必须发出查询以告知MySQL您的应用程序期望连接上的数据如何被编码:SET NAMES 'utf8mb4'。 关于utf8mb4/ utf8适用与上述相同的考虑。 输出: 如果您的应用程序将文本传输到其他系统,则还需要告知他们字符编码。对于Web应用程序,必须告知浏览器发送数据的编码(通过HTTP响应标头或HTML元数据)。 在PHP中,您可以使用default_charsetphp.ini选项,或Content-Type自己手动发出MIME标头,这虽然工作更多,但效果相同。 使用编码输出时json_encode(),请添加JSON_UNESCAPED_UNICODE作为第二个参数。 输入: 不幸的是,在尝试存储或在任何地方使用它之前,您应该验证每个收到的字符串都是有效的UTF-8。PHP mb_check_encoding()可以解决问题,但您必须谨慎使用。真的没有办法解决这个问题,因为恶意客户端可以使用他们想要的任何编码来提交数据,而且我还没有找到使PHP可靠地为您执行此操作的技巧。 从我对当前HTML规范的阅读中,对于现代HTML,以下子项目不再是必需的,甚至不再有效。我的理解是浏览器将使用为文档指定的字符集并提交数据。但是,如果您定位的是旧版HTML(XHTML,HTML4等),则以下几点可能仍然有用: 仅适用于HTML5之前的HTML:您希望浏览器发送给您的所有数据都使用UTF-8。不幸的是,如果您唯一可靠的方法是将该accept-charset属性添加到所有 代码中:<form ... accept-charset="UTF-8">。 仅对于HTML5之前的HTML:请注意,W3C HTML规范指出,客户端“应”默认使用服务器提供的任何字符集将表单发送回服务器,但这显然仅是建议,因此需要在每一个服务器上都明确标签。 其他代码注意事项: 显然,您将要提供的所有文件(PHP,HTML,JavaScript等)都应使用有效的UTF-8进行编码。 您需要确保每次处理UTF-8字符串时,都必须安全进行。不幸的是,这是最困难的部分。您可能需要大量使用PHP的mbstring扩展。 PHP的内置字符串操作默认情况下不是 UTF-8安全的。 您可以使用正常的PHP字符串操作(例如串联)安全地进行某些操作,但是对于大多数事情,您应该使用等效的mbstring功能。 要知道您在做什么(请阅读:不要搞砸),您确实需要了解UTF-8及其在最低级别上的工作方式。查看utf8.com上的任何链接,以获取一些好的资源,以学习您需要了解的所有内容。

保持可爱mmm 2020-05-08 09:43:44 0 浏览量 回答数 0

回答

就拿查询MySQL获取结果集并在页面上显示数据为例来分析. HTTP请求由C级别的程序比如Apache/Nginx处理(Java的HTTP服务用的是Java开发的Tomcat等), PHP则调用内置在PHP引擎的C开发的数据库驱动mysqlnd(Java用的是Java开发的JDBC驱动)来操作MySQL, 查询的逻辑这个重点都落在了C/C++开发的MySQL身上, 然后就是把返回结果集放到PHP数组, 经过字符串处理后在页面输出, 这些逻辑并不复杂, PHP负荷并不大. 值得注意的是, PHP内置的大量库函数全部使用C实现, 而Java的核心运行时类库rt.jar则是使用Java实现.在一些CLI下的压力测试中,因为存在大量的循环,很容易就触发Java的JIT热点编译,这时Java的计算性能上升到C的级别,这样的测试结果只能说Java在计算上的性能碾压动态解释型弱类型的PHP,而不是在Web上.对比具有JIT的机制的HHVM和PHP7的性能也能说明这个问题,在bench.php这个计算脚本的压力测试中,HHVM还是要比PHP7快1到2倍,但在WordPress等真实Web应用的测试中,HHVM和PHP7两者的性能相近.PHP的运行模式要比Java健壮稳定得多,比如PHP-FPM是经典的多进程prefork模式,主进程会维持指定数量的工作进程数,可以设置工作进程在处理多少个请求后自动重启.反观Java多线程的Tomcat,除了内存膨胀,代码稍有不慎,就有可能让Tomcat崩溃退出,抛出一大堆的错误信息.PHP开启ZendOpcache后,可以把脚本生成的opcode缓存到内存形成opcache供下次请求直接在ZendVM上执行,能带来一定的性能提升.PHP进程(PHP-FPM,Apache)可以和MySQL/Memcached/Redis建立持久连接,一个PHP进程保持一个MySQL持久连接,省去每次请求都建立连接的开销.但需要注意PHP进程数不要超过MySQL最大连接数这一点,超时或重启MySQL后PHP-FPM在代码mysqli_connect时会自动重连,但会返回"MySQL server has gone away"的Warning信息,可以用@抑制错误输出.PHP的热部署特性大大方便了开发和运维,这点是Java等其他语言(包括RoR/Python/Node.JS)所不能媲美的.

蛮大人123 2019-12-02 01:53:14 0 浏览量 回答数 0

问题

PHP开发中的外围资源性能分析(一)

sunny夏筱 2019-12-01 21:45:29 6222 浏览量 回答数 1

问题

APACHE+PHP vs NGINX+PHP 性能评测(译文)

enj0y 2019-12-01 20:22:13 25498 浏览量 回答数 6
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 云栖号物联网 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 2020阿里巴巴研发效能峰会 企业建站模板 云效成长地图 高端建站 云栖号弹性计算 阿里云云栖号 云栖号案例 云栖号直播