为了账号安全,请及时绑定邮箱和手机立即绑定

参考:使用MySQL扩展的完美代码示例是什么?

参考:使用MySQL扩展的完美代码示例是什么?

MM们 2019-06-14 15:38:28
参考:使用MySQL扩展的完美代码示例是什么?这是为了创建一个社区学习资源..我们的目标是有好的代码示例,这些代码不会重复复制/粘贴PHP代码中经常出现的可怕错误。我已经要求它成为社区维基。这是不是作为编码比赛。它不是寻找最快或最紧凑的方式来进行查询-它是提供一个好的,可读的参考,特别是对新手。每天都有大量的问题涌入真的很糟糕使用mysql_*堆栈溢出的函数族。虽然通常最好将这些人引导到PDO,但有时这既不可能(例如继承的遗留软件),也不现实(用户已经在他们的项目中使用它)。使用mysql_*图书馆包括:SQL注入值限制子句和动态表名中的SQL注入没有错误报告(“为什么这个查询不能工作?”)错误报告(也就是说,即使在代码投入生产时也会发生错误)值输出中的跨站点脚本(Xss)注入让我们编写一个PHP代码示例,它使用MySQL_*函数族:接受两个员额值,id(数字)及name(a字符串)对表执行更新查询tablename,更改name列中具有ID的id如果出现故障,请友好地退出,但只在生产模式中显示详细的错误。trigger_error()就足够了;或者使用您选择的方法。输出消息“$name最新情况“。而且真的不显示上面列出的任何弱点。应该是尽可能简单..理想情况下,它不包含任何函数或类。目标不是创建副本/可压缩库,而是创建显示使数据库查询安全所需的最小操作。好的评论加分。这样做的目的是使这个问题成为一个资源,当用户遇到一个有错误代码的问题询问者(尽管它根本不是问题的焦点)或者遇到一个失败的查询并且不知道如何解决它时,用户可以链接到这个资源。预先阻止PDO的讨论:是的,它往往会更好地指导个人写这些问题的PDO。当它成为一种选择时,我们应该这样做。然而,这并不总是可能的-有时,问题问者正在处理遗留代码,或者已经有了很长的路要用这个库,而且现在不太可能改变它。此外,mysql_*如果使用得当,功能家族是完全安全的。所以这里没有“使用PDO”的答案。
查看完整描述

3 回答

?
慕仙森

TA贡献1827条经验 获得超7个赞

我的刺。试着保持它尽可能简单,同时仍然保持一些现实世界的便利。

处理Unicode,并使用松散比较来实现可读性。友好点;-)

<?php

header('Content-type: text/html; charset=utf-8');error_reporting(E_ALL | E_STRICT);ini_set('display_errors', 1);
// display_errors can be changed to 0 in production mode to// suppress PHP's error messages/*
Can be used for testing
$_POST['id'] = 1;
$_POST['name'] = 'Markus';
*/$config = array(
    'host' => '127.0.0.1', 
    'user' => 'my_user', 
    'pass' => 'my_pass', 
    'db' => 'my_database');# Connect and disable mysql error output$connection = @mysql_connect($config['host'], 
    $config['user'], $config['pass']);if (!$connection) {
    trigger_error('Unable to connect to database: ' 
        . mysql_error(), E_USER_ERROR);}if (!mysql_select_db($config['db'])) {
    trigger_error('Unable to select db: ' . mysql_error(), 
        E_USER_ERROR);}if (!mysql_set_charset('utf8')) {
    trigger_error('Unable to set charset for db connection: ' 
        . mysql_error(), E_USER_ERROR);}$result = mysql_query(
    'UPDATE tablename SET name = "' 
    . mysql_real_escape_string($_POST['name']) 
    . '" WHERE id = "' 
    . mysql_real_escape_string($_POST['id']) . '"');if ($result) {
    echo htmlentities($_POST['name'], ENT_COMPAT, 'utf-8') 
        . ' updated.';} else {
    trigger_error('Unable to update db: ' 
        . mysql_error(), E_USER_ERROR);}


查看完整回答
反对 回复 2019-06-14
?
ITMISS

TA贡献1871条经验 获得超8个赞

我决定跳过枪放点东西。一开始就是这样。在错误时抛出异常。

function executeQuery($query, $args) {
    $cleaned = array_map('mysql_real_escape_string', $args);

    if($result = mysql_query(vsprintf($query, $cleaned))) {
        return $result;
    } else {
        throw new Exception('MySQL Query Error: ' . mysql_error());
    }}function updateTablenameName($id, $name) {
    $query = "UPDATE tablename SET name = '%s' WHERE id = %d";

    return executeQuery($query, array($name, $id));}try {
    updateTablenameName($_POST['id'], $_POST['name']);} catch(Exception $e) {
    echo $e->getMessage();
    exit();}


查看完整回答
反对 回复 2019-06-14
  • 3 回答
  • 0 关注
  • 353 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信