这是为了创建 社区学习资源 。我们的目标是拥有一些好的代码示例,这些示例不会重复在复制/粘贴的PHP代码中经常发现的严重错误。我已要求将其设为Community Wiki。 这 不是编码竞赛。 这并不是要找到最快或最紧凑的查询方式,而是要为新手提供良好的可读性参考。
这是为了创建 社区学习资源 。我们的目标是拥有一些好的代码示例,这些示例不会重复在复制/粘贴的PHP代码中经常发现的严重错误。我已要求将其设为Community Wiki。
这 不是编码竞赛。 这并不是要找到最快或最紧凑的查询方式,而是要为新手提供良好的可读性参考。
每天,都会使用Stack Overflow上的函数系列大量涌入带有 非常糟糕的 代码片段的问题mysql_*。尽管通常最好是将这些人员引导到PDO,但有时这既不可能(例如,继承的遗留软件),也没有现实的期望(用户已经在其项目中使用了它)。
mysql_*
使用该mysql_*库的代码的常见问题包括:
让我们编写一个PHP代码示例,该示例使用mySQL_ *系列函数执行以下操作:
id
name
tablename
trigger_error()
$name
并且 没有 显示出上面列出的任何弱点。
它应该 尽可能简单 。理想情况下,它不包含任何函数或类。目标不是创建可复制/粘贴的库,而是 显示使数据库查询安全所需要做的最少工作。
奖励积分可带来好评。
目的是使该问题成为用户遇到错误代码(即使它根本不是问题的重点)或遇到查询失败且没有错误的提问者时可以链接到的资源知道如何解决它。
要抢先讨论PDO,请执行以下操作:
是的,通常最好将写这些问题的个人引导到PDO。如果可以选择,我们应该这样做。但是,这并非总是可能的- 有时,问问者正在处理遗留代码,或者已经对该库进行了很长的探索,并且现在不太可能更改它。此外,mysql_*如果正确使用这些功能,则是完全安全的。因此,请在这里没有“使用PDO”的答案。
我的刺。试图使其尽可能简单,同时仍保留一些实际的便利。
处理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); }