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

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

这是为了创建一个社区学习资源..我们的目标是有好的代码示例,这些代码不会重复复制/粘贴PHP代码中经常出现的可怕错误。我已经要求它成为社区维基。

这是不是作为编码比赛。它不是寻找最快或最紧凑的方式来进行查询-它是提供一个好的,可读的参考,特别是对新手。

每天都有大量的问题涌入真的很糟糕使用mysql_*堆栈溢出的函数族。虽然通常最好将这些人引导到PDO,但有时这既不可能(例如继承的遗留软件),也不现实(用户已经在他们的项目中使用它)。

使用mysql_*图书馆包括:

  • SQL注入值
  • 限制子句和动态表名中的SQL注入
  • 没有错误报告(“为什么这个查询不能工作?”)
  • 错误报告(也就是说,即使在代码投入生产时也会发生错误)
  • 值输出中的跨站点脚本(Xss)注入

让我们编写一个PHP代码示例,它使用MySQL_*函数族:

  • 接受两个员额值,

    id

    (数字)及

    name

    (a字符串)
  • 对表执行更新查询

    tablename

    ,更改

    name

    列中具有ID的

    id

  • 如果出现故障,请友好地退出,但只在生产模式中显示详细的错误。

    trigger_error()

    就足够了;或者使用您选择的方法。
  • 输出消息“

    $name

    最新情况“。

而且真的显示上面列出的任何弱点。

应该是尽可能简单..理想情况下,它不包含任何函数或类。目标不是创建副本/可压缩库,而是创建显示使数据库查询安全所需的最小操作。

好的评论加分。

这样做的目的是使这个问题成为一个资源,当用户遇到一个有错误代码的问题询问者(尽管它根本不是问题的焦点)或者遇到一个失败的查询并且不知道如何解决它时,用户可以链接到这个资源。

预先阻止PDO的讨论:

是的,它往往会更好地指导个人写这些问题的PDO。当它成为一种选择时,我们应该这样做。然而,这并不总是可能的-有时,问题问者正在处理遗留代码,或者已经有了很长的路要用这个库,而且现在不太可能改变它。此外,mysql_*如果使用得当,功能家族是完全安全的。所以这里没有“使用PDO”的答案。


MM们
浏览 354回答 3
3回答

慕仙森

我的刺。试着保持它尽可能简单,同时仍然保持一些现实世界的便利。处理Unicode,并使用松散比较来实现可读性。友好点;-)<?php header('Content-type:&nbsp;text/html;&nbsp;charset=utf-8');error_reporting(E_ALL&nbsp;|&nbsp;E_STRICT);ini_set('display_errors',&nbsp;1); //&nbsp;display_errors&nbsp;can&nbsp;be&nbsp;changed&nbsp;to&nbsp;0&nbsp;in&nbsp;production&nbsp;mode&nbsp;to//&nbsp;suppress&nbsp;PHP's&nbsp;error&nbsp;messages/* Can&nbsp;be&nbsp;used&nbsp;for&nbsp;testing $_POST['id']&nbsp;=&nbsp;1; $_POST['name']&nbsp;=&nbsp;'Markus'; */$config&nbsp;=&nbsp;array( &nbsp;&nbsp;&nbsp;&nbsp;'host'&nbsp;=>&nbsp;'127.0.0.1',&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;'user'&nbsp;=>&nbsp;'my_user',&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;'pass'&nbsp;=>&nbsp;'my_pass',&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;'db'&nbsp;=>&nbsp;'my_database');#&nbsp;Connect&nbsp;and&nbsp;disable&nbsp;mysql&nbsp;error&nbsp;output$connection&nbsp;=&nbsp;@mysql_connect($config['host'],&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;$config['user'],&nbsp;$config['pass']);if&nbsp;(!$connection)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;trigger_error('Unable&nbsp;to&nbsp;connect&nbsp;to&nbsp;database:&nbsp;'&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.&nbsp;mysql_error(),&nbsp;E_USER_ERROR);}if&nbsp;(!mysql_select_db($config['db']))&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;trigger_error('Unable&nbsp;to&nbsp;select&nbsp;db:&nbsp;'&nbsp;.&nbsp;mysql_error(),&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;E_USER_ERROR);}if&nbsp;(!mysql_set_charset('utf8'))&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;trigger_error('Unable&nbsp;to&nbsp;set&nbsp;charset&nbsp;for&nbsp;db&nbsp;connection:&nbsp;'&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.&nbsp;mysql_error(),&nbsp;E_USER_ERROR);}$result&nbsp;=&nbsp;mysql_query( &nbsp;&nbsp;&nbsp;&nbsp;'UPDATE&nbsp;tablename&nbsp;SET&nbsp;name&nbsp;=&nbsp;"'&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;.&nbsp;mysql_real_escape_string($_POST['name'])&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;.&nbsp;'"&nbsp;WHERE&nbsp;id&nbsp;=&nbsp;"'&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;.&nbsp;mysql_real_escape_string($_POST['id'])&nbsp;.&nbsp;'"');if&nbsp;($result)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;htmlentities($_POST['name'],&nbsp;ENT_COMPAT,&nbsp;'utf-8')&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.&nbsp;'&nbsp;updated.';}&nbsp;else&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;trigger_error('Unable&nbsp;to&nbsp;update&nbsp;db:&nbsp;'&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.&nbsp;mysql_error(),&nbsp;E_USER_ERROR);}

ITMISS

我决定跳过枪放点东西。一开始就是这样。在错误时抛出异常。function&nbsp;executeQuery($query,&nbsp;$args)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;$cleaned&nbsp;=&nbsp;array_map('mysql_real_escape_string',&nbsp;$args); &nbsp;&nbsp;&nbsp;&nbsp;if($result&nbsp;=&nbsp;mysql_query(vsprintf($query,&nbsp;$cleaned)))&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$result; &nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;Exception('MySQL&nbsp;Query&nbsp;Error:&nbsp;'&nbsp;.&nbsp;mysql_error()); &nbsp;&nbsp;&nbsp;&nbsp;}}function&nbsp;updateTablenameName($id,&nbsp;$name)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;$query&nbsp;=&nbsp;"UPDATE&nbsp;tablename&nbsp;SET&nbsp;name&nbsp;=&nbsp;'%s'&nbsp;WHERE&nbsp;id&nbsp;=&nbsp;%d"; &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;executeQuery($query,&nbsp;array($name,&nbsp;$id));}try&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;updateTablenameName($_POST['id'],&nbsp;$_POST['name']);}&nbsp;catch(Exception&nbsp;$e)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;$e->getMessage(); &nbsp;&nbsp;&nbsp;&nbsp;exit();}
打开App,查看更多内容
随时随地看视频慕课网APP