在我们的位置,我们将使用mysqli和PDO分为准备语句和事务支持之类的东西.有些项目使用一个,另一个项目.我们很难有可能转移到另一个RDBMS.
我更喜欢PDO,因为它允许为预准备语句提供命名参数,据我所知,mysqli没有.
在我们整合项目时只使用一种方法,是否还有其他优点和缺点选择其中一种作为标准?
哪个更好,MySQL还是MySQLi?为什么?我应该使用哪个?
我的意思不仅仅是在性能方面,还有其他相关功能.
这是我的代码:
include 'conn.php';
$conn = new Connection();
$query = 'SELECT EmailVerified, Blocked FROM users WHERE Email = ? AND SLA = ? AND `Password` = ?';
$stmt = $conn->mysqli->prepare($query);
$stmt->bind_param('sss', $_POST['EmailID'], $_POST['SLA'], $_POST['Password']);
$stmt->execute();
$result = $stmt->get_result();
Run Code Online (Sandbox Code Playgroud)
我在最后一行得到错误:调用未定义的方法mysqli_stmt :: get_result()
这是conn.php的代码:
define('SERVER', 'localhost');
define('USER', 'root');
define('PASS', 'xxxx');
define('DB', 'xxxx');
class Connection{
/**
* @var Resource
*/
var $mysqli = null;
function __construct(){
try{
if(!$this->mysqli){
$this->mysqli = new MySQLi(SERVER, USER, PASS, DB);
if(!$this->mysqli)
throw new Exception('Could not create connection using …Run Code Online (Sandbox Code Playgroud) 我搜索过网络,到目前为止我所看到的是你可以使用mysql_和mysqli_一起意义:
<?php
$con=mysqli_connect("localhost", "root" ,"" ,"mysql");
if( mysqli_connect_errno( $con ) ) {
echo "failed to connect";
}else{
echo "connected";
}
mysql_close($con);
echo "Done";
?>
Run Code Online (Sandbox Code Playgroud)
要么
<?php
$con=mysql_connect("localhost", "root" ,"" ,"mysql");
if( mysqli_connect_errno( $con ) ) {
echo "failed to connect";
}else{
echo "connected";
}
mysqli_close($con);
echo "Done";
?>
Run Code Online (Sandbox Code Playgroud)
有效,但是当我使用这段代码时,我得到的是:
Connected
Warning: mysql_close() expects parameter 1 to be resource, object given in D:\************.php on line 9
Done
Run Code Online (Sandbox Code Playgroud)
对于第一个和相同的除外mysqli_close().对于第二个.
问题是什么?我不能使用mysql_和mysqli在一起?还是正常的?我可以检查连接是否有效吗?(if(mysq...))
我知道你绝不应该信任表单中的用户输入,主要是因为SQL注入的可能性.
但是,这是否也适用于唯一输入来自下拉列表的表单(见下文)?
我将保存$_POST['size']到一个会话,然后在整个站点中使用该会话来查询各种数据库(使用mysqliSelect查询),任何SQL注入肯定会损害(可能会丢失)它们.
查询数据库的类型用户输入没有区域,只有下拉列表.
<form action="welcome.php" method="post">
<select name="size">
<option value="All">Select Size</option>
<option value="Large">Large</option>
<option value="Medium">Medium</option>
<option value="Small">Small</option>
</select>
<input type="submit">
</form>
Run Code Online (Sandbox Code Playgroud) 我正在尝试执行我的PHP代码,它通过mysqli调用两个MySQL查询,并得到错误"命令不同步;你现在无法运行此命令".
这是我正在使用的代码
<?php
$con = mysqli_connect("localhost", "user", "password", "db");
if (!$con) {
echo "Can't connect to MySQL Server. Errorcode: %s\n". Mysqli_connect_error();
exit;
}
$con->query("SET NAMES 'utf8'");
$brand ="o";
$countQuery = "SELECT ARTICLE_NO FROM AUCTIONS WHERE upper(ARTICLE_NAME) LIKE % ? %";
if ($numRecords = $con->prepare($countQuery)) {
$numRecords->bind_param("s", $brand);
$numRecords->execute();
$data = $con->query($countQuery) or die(print_r($con->error));
$rowcount = $data->num_rows;
$rows = getRowsByArticleSearch("test", "Auctions", " ");
$last = ceil($rowcount/$page_rows);
} else {
print_r($con->error);
}
foreach ($rows as $row) {
$pk = $row['ARTICLE_NO'];
echo '<tr>' …Run Code Online (Sandbox Code Playgroud) 在我的本地/开发环境中,MySQLi查询执行正常.但是,当我在我的Web主机环境中上传它时,我收到此错误:
致命错误:在...中的非对象上调用成员函数bind_param()
这是代码:
global $mysqli;
$stmt = $mysqli->prepare("SELECT id, description FROM tbl_page_answer_category WHERE cur_own_id = ?");
$stmt->bind_param('i', $cur_id);
$stmt->execute();
$stmt->bind_result($uid, $desc);
Run Code Online (Sandbox Code Playgroud)
为了检查我的查询,我试图通过控制面板phpMyAdmin执行查询,结果是OK.
我正在做一个教程,我收到此错误:
致命错误:第8行找不到类'MySQLi'(LONG URL)
第8行的代码是:
$mysqli = new MySQLi($db_server, $db_user, $db_pass, $db_name) or die(mysqli_error());
Run Code Online (Sandbox Code Playgroud)
我在网上看到有人说要看看它是否在我的phpinfo()中打开了,但是其中没有列出"mysqli"的内容.
另外,我正在运行PHP 5.2.5版
在PHP中,每当我尝试连接到数据库时,我都会收到以下警告(通过mysql_connect)
警告:mysql_connect():标头和客户端库次要版本不匹配.标题:50162图书馆:50524
在我的php -i输出中,我在mysqli下列出了以下值
客户端API库版本=> 5.5.24
客户端API标头版本=> 5.1.62
我已经尝试更新php5-mysql 和 php,但我已经在他们两个的最新版本.如何更新标题版本以便我不再看到此警告?
编辑
我的MySQL文件应全部更新为最新版本:
$ apt-get install mysql.*5.5
. . .
mysql-client-5.5 is already the newest version.
mysql-server-core-5.5 is already the newest version.
mysql-server-5.5 is already the newest version.
mysql-testsuite-5.5 is already the newest version.
mysql-source-5.5 is already the newest version.
Run Code Online (Sandbox Code Playgroud)
删除旧版本
$ apt-get remove mysql.*5.1
. . .
Package handlersocket-mysql-5.1 is not installed, so not removed
Package mysql-cluster-client-5.1 is not installed, so not removed
Package mysql-cluster-server-5.1 …Run Code Online (Sandbox Code Playgroud)