简体   繁体   中英

Find/replace mysql_ to mysqli_ makes code nonfunctional

So as I'm sure anyone who's been a regular on SO has noticed, the mysql_ functions are going to be deprecated and it is suggested that one use mysqli_ or PDO instead. Thus, I decided to transition over to mysqli by doing a simple find/replace in my code, replacing every mysql_ with mysqli_ . This seemed to work okay in Dreamweaver, and I got no syntax errors or anything. All the new mysqli_ functions were colored blue, meaning that they were recognized as valid functions.

However, when I saved everything and ran the code, I noticed that any code having to do with mysql had become nonfunctional. Undoing the replace solved the problem.

Is my server perhaps not supporting the mysqli functions? I know that it's running php 5 and mysql 5. Is there perhaps something else that you have to add to the code? What am I missing?

It's a good time to switch now, since PHP 7.0 removed the ext/mysql functions from core.

Consider the following legacy code

$res = mysql_query($sql);

The mysql_ functions were lazy, in that it would use whatever connection was open. But mysqli_ is not only not lazy, it's an object , not a connection resource (which is what mysql_connect() would return). Look at these lines here for connecting to the database

$mysqli = new mysqli('host', 'username', 'password', 'db');
$mysqli = mysqli_connect('host', 'username', 'password', 'db');

Both of them give you the same thing...

Returns an object which represents the connection to a MySQL Server.

Yes, that's right. Even the procedural connection function returns an object. The simplest way to use it is directly in is object form

$mysqli->query($sql);

The procedural functions are simply wrappers for this. But they are NOT lazy. Check out the difference

mysqli_query($mysqli, $sql);

The single largest gotcha in this (why a simple find and replace of mysql_ with mysqli_ fails) is that most of the mysqli_ functions require you to pass the connection object as the first argument . It's also important to note that results are objects as well ( mysqli_result class), although their procedural counterparts only require the result set so you can simply find/replace those.

Just to be complete, there's one other gotcha that's less common (this is really old code): mysql_result . This function has no equivalent in mysqli_ . You should switch to the full row return functions like mysqli_fetch_assoc($result)

你可能想看看http://wiki.hashphp.org/PDO_Tutorial_for_MySQL_Developers ,它应该告诉你关于迁移mysql_代码的所有知识,但是要告诉你PDO,而不是MySQLi ..

you Have to know There are many issues might had be done when you were replacing your code.

  1. Check the installation of mysqli here .
  2. check the configuration of mysqli here .
  3. check the DB connection in tow ways :

    ** simple connection like natimysql:

    $con = mysqli_connect("localhost","my_user","my_password","my_db");

    But Now You have to use it like that

    mysqli_query($con,"SELECT * FROM Table"); // $con is the connection which is must for executing the sql query

    **my best way is dealing with it as new mysqli object like that :

    $con = new mysqli('localhost', 'user', 'pass', 'demo');

    now you will do it like that :

     $sql = "SELECT * FROM Table"; $con->query($sql); 

    if you checked every query that you had done before You must find one of these errors specially the errors in the 3rd point you can take a tour in its tutorial here , here or here

Surprised nobody has mentioned that the mysql_ and mysqli_ functions are not exact parallels, therefore a search and replace is bound to fail. Also mysqli_ will generally insist on the database connection parameter (when used in procedural mode, which is what you're aiming fo), where mysql_ would just grab whatever connection had been opened earlier in the code.

If you have debugging enabled, you should be able to work through the errors.

The most common 'gotcha' is that there is no mysqli equivalent of mysql_result(), which people often used when getting a single result. I'd be willing to bet your code is scattered with "mysqli_result()" calls, which will all fail.

That's the basic fix. The 'good' fix might be to use a dedicated class for all your SQL calls, so that there are only a handful of uses of the mysqli functions in your entire codebase, and all in a single file. That way when you refactor you don't need to search through mountains of files all with a variety of different uses of various mysqli functions.

If you "Need some authoritative sources for MySQL -> MySQLi migration" I can recommend a website called Google ;-) Type in "MySQL -> MySQLi migration".

For instance, this 'for Dummies' page shows you the differences between the various functions that you'll need to address to get your code working.

http://www.dummies.com/how-to/content/how-to-convert-mysqli-functions-to-mysql-functions.html

mysql_ functions are now deprecated

Nope, they aren't yet

I decided to transition over to mysqli by doing a simple find/replace in my code

the problem most likely lies in the fact that mysqli functions has reverse parameters order and require connection resource explicitly.

Nevertheless, even if you succeed with such a bulk replace, it will do not a slightest good to your code , so, you'd better keep it as is, despite of some errr... overenthusiastic campaign on this site.

  1. There is no reason to hurry. You have at least 5 years until you'd start notice some inconvenience.
  2. The goal of all this noise about mysql functions is not for changing some API to another but for making usual PHP codes slightly more sensible and safe. You won't reach neither of these goals with just search and replace - so, there is no reason to do it at all.

What you really need is a some intelligent way of handling queries, encapsulated in some library class, which will not only improve your experience with running SQL queries but also will move all the API functions into one place where they can be easily replaced to whatever API some folks will decide to force you to use.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM