问题描述
我有以下PHP代码作为dabatase.class.PHP
的一部分来处理我的MysqLi函数。效果很好,我一直在慢慢改进。但是,我注意到当出现错误时,我的脚本会以静默方式失败。
database.class.PHP摘录
class database {
var $host; // MysqL host to connect to
var $user; // MysqL user name
var $pass; // MysqL password
var $db; // MysqL database to select
var $prefix; // MysqL table prefix
var $path; // Path to main directory
var $stmt; // Prepared Statement
var $err; // Set to true in constructor to show errors by default if one occurs.
var $last_error; // holds the last error. Usually MysqLi_error() or other MysqLi error.
var $last_query; // holds the last query executed.
var $last_parameters; // holds the last parameters for the last query
var $row_count; // holds the last number of rows from a select
var $result; // Holds the result.
var $conn; // MysqLi Connection Link
var $db_link; // current/last database link identifier
var $auto_slashes; // the class will add/strip slashes when it can
var $queries; // hold the count of queries used to generate the page
// class constructor. Initializations here.
// Setup your own default values for connecting to the database here.
public function __construct($data) {
$this->host = $data["host"];
$this->user = $data["user"];
$this->pass = $data["pass"];
$this->db = $data["db"];
$this->prefix = $data["prefix"];
$this->site_title = $data["site_title"];
$this->dev_email = $data["dev_email"];
$this->path = $data["path"];
$this->err = true;
$this->conn = @new MysqLi($this->host,$this->user,$this->pass,$this->db);
if($this->conn->connect_errno > 0){
$this->last_error = 'Unable to connect to database [' . $this->conn->connect_error . ']';
echo $this->error();
die();
}
else {
$this->conn->set_charset("utf8");
}
}
function select($sql,$err=false) {
$this->last_query = $sql;
if(!$result = $this->conn->query($sql)){
$this->last_error = $this->conn->error;
if($this->conn->error) {
$sql = trim(preg_replace('/\s+/',' ',$sql));
$this->log_error("MysqL",$this->last_error." ☼ ".$sql);
}
} else {
return $result;
}
}
function prepare($sql) {
$this->last_query = $sql; //Save query to show later on.
$this->stmt = $this->conn->prepare($sql);
}
function execute($params=array()) {
$action = explode(' ',trim($this->last_query))[0];
$ident = '';
$parameters = '';
$vars = array();
if($this->stmt!==false) {
if(!empty($params) || count($params) == 0) {
foreach($params as $k => $v) {
foreach($v as $a => $b) {
$ident .= $a;
$vars[] .= $b;
$parameters .= $a.' => '.$b.'<br>'; // For MysqL error reporting
}
}
$this->stmt->bind_param( $ident,...$vars );
$this->parameters = $parameters;
}
else {
$this->paramaters = '';
}
$success = $this->stmt->execute();
if($success) {
if($action=="SELECT") {
$this->result = $this->stmt->get_result();
}
else {
return $success;
}
}
else {
if($this->conn->error) {
$this->last_error = $this->conn->error;
//$sql = trim(preg_replace('/\s+/',$this->last_query));
//$this->log_error("MysqL",$this->last_error." ☼ ".$this->last_query);
//$this->print_last_error(true);
echo $this->error();
}
echo 'ERRORS: '.$this->error();
return false;
}
$this->stmt->close();
return $this->result;
}
else {
if($this->conn->error) {
/*$this->last_error = $this->conn->error;
$sql = trim(preg_replace('/\s+/',$this->last_query));
$this->log_error("MysqL",$this->last_error." ☼ ".$this->last_query);*/
echo $this->error();
}
}
//$data = $result->fetch_all();
}
function select_one($sql,$this->last_error." ☼ ".$sql);
}
} else {
return $this->MysqLi_result($result,0);
//return $result;
}
}
function insert_sql($sql,$this->last_error." ☼ ".$sql);
}
} else {
return $result;
}
}
function multi_query($sql,$err=false) {
$this->last_query = $sql;
if(!$result = $this->conn->multi_query($sql)){
if ($result) {
do {
// grab the result of the next query
if (($result = MysqLi_store_result($this->conn)) === false && MysqLi_error($this->conn) != '') {
//echo "Query Failed: " . MysqLi_error($this->conn);
}
} while (MysqLi_more_results($this->conn) && MysqLi_next_result($this->conn)); // while there are more results
} else {
//echo "First query Failed..." . MysqLi_error($this->conn);
}
$this->last_error = $this->conn->error;
if($this->conn->error) {
$sql = trim(preg_replace('/\s+/',$this->last_error." ☼ ".$sql);
}
} else {
return $result;
}
}
function update_sql($sql,$this->last_error." ☼ ".$sql);
}
} else {
return $result;
}
}
function update($sql,$this->last_error." ☼ ".$sql);
}
} else {
return $result;
}
}
function num_rows($result=1,$prepared=0) {
if ( $result === FALSE && $prepared==0) {
return 0;
}
elseif($result === NULL && $prepared==0) {
return 0;
}
elseif($result===1 && $prepared===1) {
return $this->result->num_rows;
}
else {
return $result->num_rows;
}
}
function fetch($result) {
$array = array();
if($result instanceof MysqLi_stmt)
{
$result->store_result();
$variables = array();
$data = array();
$Meta = $result->result_Metadata();
while($field = $Meta->fetch_field())
$variables[] = &$data[$field->name]; // pass by reference
call_user_func_array(array($result,'bind_result'),$variables);
$i=0;
while($result->fetch())
{
$array[$i] = array();
foreach($data as $k=>$v)
$array[$i][$k] = $v;
$i++;
// don't kNow why,but when I tried $array[] = $data,I got the same one result in all rows
}
}
elseif($result instanceof MysqLi_result)
{
while($row = $result->fetch_assoc())
$array[] = $row;
}
if(count($array) > 0) {
return $array;
}
else {
$return = array();
array_walk_recursive($array,function($a) use (&$return) { $return[] = $a; });
return $return;
}
}
function get_row($result) {
if($result) {
return $result->fetch_assoc();
}
else {
return false;
}
}
function free($result) {
$result->free();
}
function last_id() {
return $this->conn->insert_id;
}
function MysqLi_result($res,$row,$field=0) {
$res->data_seek($row);
$daTarow = $res->fetch_array();
/*if(!isset($daTarow[$field])) {
echo $this->error();
exit();
}*/
return $daTarow[$field];
}
/* Error Handling */
/* Function to log all errors. */
function log_error($type,$error,$notify=false) {
$msg = date("Y/m/d h:i A").' ☼ '.$type.' ☼ '.$error;
if($notify) {
error_log($msg,1,$this->dev_email);
}
$log_file = $this->path."dsm/logs/$type.log";
if(file_exists($log_file)) {
}
else {
@touch($log_file);
}
// another way to call error_log():
@error_log($msg."\r\n",3,$log_file);
}
function print_last_error($show_query=true) {
// Prints the last error to the screen in a nicely formatted error message.
// If $show_query is true,then the last query that was executed will
// be displayed aswell.
?>
<div style="border: 1px solid red; font-size: 9pt; font-family: monospace; color: red; padding: .5em; margin: 8px; background-color: #FFE2E2">
<span style="font-weight: bold">database.class.PHP Error:</span><br><?PHP echo $this->last_error; ?>
</div>
<?PHP
if ($show_query && (!empty($this->last_query))) {
$this->print_last_query();
}
}
function error() {
if(!empty($this->parameters)) {
$params = '<div style="padding-left: 20px;">'.$this->parameters.'</div>';
}
if(empty($this->last_error)) {
$this->last_error = 'There are no errors in the sql Query.';
return '
<div style="background-color:#f9f9f9; border: 3px solid #D70000; padding: 5px; margin: 5px;"><span style="font-weight: bold; color: #D70000;">database.class.PHP Error:</span>
'.$this->last_error.'
</div>';
}
else {
return '
<div style="background-color:#f9f9f9; border: 3px solid #D70000; padding: 5px; margin: 5px;"><span style="font-weight: bold; color: #D70000;">database.class.PHP Error:</span>
'.$this->last_error.'
<div style="background-color:#f9f9f9; border: 3px solid #0000D7; padding: 5px; margin: 5px;"><span style="font-weight: bold; color: #D70000;">Last sql Query: </span>
<br>
<span style="padding-left: 20px;font-family: monospace;">'.str_replace("\n",'<br>',$this->last_query).'</span></div>
<div style="background-color:#f9f9f9; border: 3px solid #00D700; padding: 5px; padding-left: 20px; margin: 5px;"><span style="font-weight: bold; color: #D70000;">Last sql Parameters: </span>
<br>
<span style="font-family: monospace;">'.$params.'</span>
</div>
</div>';
}
}
function print_last_query() {
// Prints the last query that was executed to the screen in a nicely formatted
// Box.
?>
<div style="border: 1px solid blue; font-size: 9pt; font-family: monospace; color: blue; padding: .5em; margin: 8px; background-color: #E6E5FF">
<span style="font-weight: bold">Last sql Query:</span><br><span style="padding-left: 20px;"><?PHP echo str_replace("\n",$this->last_query); ?></span>
<br>
<?PHP if(!empty($this->parameters)) { ?>
<span style="font-weight: bold">Last sql Parameters:</span><br><div style="padding-left: 20px;"><?PHP echo $this->parameters; ?></div>
<?PHP } ?>
</div>
<?PHP
}
}
现在,我知道有一个错误(我故意在选择命令的数据库名称中间添加了一个反斜线以测试该错误。但是,当我var_dump
$this->conn-error
时没有错误,并且是NULL
;尽管在MySQL查询中是明显的致命错误。
为什么我没有收到错误?我试过移动$ stmt-close();函数(如我在另一个答案中读到的,但这会阻止许多其他查询成功完成并返回其信息。
编辑::添加了完整的database.class.PHP脚本。
编辑:回复@mickmackusa。
-
我已从脚本中删除了$ err变量。
-
以下是一些有关如何使用准备好的语句来调用脚本的示例。
$get = $db->prepare("SELECT * FROM `".$db->prefix."pw_water_meters` ORDER BY `id` DESC"); $get = $db->execute();
以上没有发送任何参数给类,因为没有要发送的信息。
如果查询正确,则可以正常工作。$get = $db->prepare("UPDATE `".$db->prefix."pw_water_meters` SET `old_serial` ?,`new_serial` = ? WHERE `id` = ?"); $params = array( array('s' => $_POST["old"]),array('s' => $_POST["new"]),array('i' => $_POST["id"]) ); $get = $db->execute($params); $get = $db->prepare("SELECT * FROM `".$db->prefix."pw_water_meters` WHERE `id` = ?"); $params = array( array('i' => $_POST["id"]) ); $get = $db->execute($params); while($row = $db->get_row($get)) { /* Echo row or do whatever with it */ }
$select = $db->select("SELECT * FROM `".$db->prefix."pw_water_meters` WHERE id`='3'"); if($db->num_rows($select) > 0) { $meter = $db->get_row($select); }
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)