这是为了创建社区学习资源。我们的目标是拥有一些好的代码示例,这些示例不会重复在复制/粘贴的PHP代码中经常发现的严重错误。我已要求将其设为Community Wiki。
这不是编码竞赛。这并不是要找到最快或最紧凑的查询方式,而是要为新手提供良好的可读性参考。
每天,都会使用Stack Overflow上的函数系列大量涌入带有非常糟糕的代码片段的问题mysql_*。尽管通常最好是将这些人员引导到PDO,但有时这既不可能(例如,继承的遗留软件),也没有现实的期望(用户已经在其项目中使用了它)。
使用该mysql_*库的代码的常见问题包括:
SQL注入值 限制子句和动态表名称中的SQL注入 没有错误报告(“为什么此查询不起作用?”) 错误的错误报告(即,即使将代码投入生产,也总是会发生错误) 跨站点脚本(XSS)注入值输出 让我们编写一个PHP代码示例,该示例使用mySQL_ *系列函数执行以下操作:
接受两个POST值,id(数字)和name(字符串) 对表执行UPDATE查询tablename,更改nameID为1的行中的列id 发生故障时,请优雅地退出,但仅在生产模式下显示详细错误。trigger_error()就足够了; 或者使用您选择的方法 输出消息“ $name更新”。 并且没有显示出上面列出的任何弱点。
它应该尽可能简单。理想情况下,它不包含任何函数或类。目标不是创建可复制/粘贴的库,而是显示使数据库查询安全所需要做的最少工作。
奖励积分可带来好评。
目的是使该问题成为用户遇到错误代码(即使它根本不是问题的重点)或遇到查询失败且没有错误的提问者时可以链接到的资源知道如何解决它。
要抢先讨论PDO,请执行以下操作:
是的,通常最好将写这些问题的个人引导到PDO。如果可以选择,我们应该这样做。但是,这并非总是可能的-有时,问问者正在处理遗留代码,或者已经对该库进行了很长的探索,并且现在不太可能更改它。此外,mysql_*如果正确使用这些功能,则是完全安全的。因此,请在这里没有“使用PDO”的答案。
我的刺。试图使其尽可能简单,同时仍保留一些实际的便利。
处理unicode并使用松散比较来提高可读性。对人好点 ;-)
'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); }来源:stack overflow版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。