This is a collection of questions that come up every now and then about syntax in PHP. This is also a Community Wiki, so everyone is invited to participate in maintaining this list.
It used to be hard to find questions about operators and other syntax tokens.¹
The main idea is to have links to existing questions on Stack Overflow, so it's easier for us to reference them, not to copy over content from …
如果插入用户输入而不修改SQL查询,则应用程序容易受到SQL注入的攻击,如下例所示:
$unsafe_variable = $_POST['user_input'];
mysql_query("INSERT INTO `table` (`column`) VALUES ('$unsafe_variable')");
Run Code Online (Sandbox Code Playgroud)
这是因为用户可以输入类似的内容value'); DROP TABLE table;--
,查询变为:
INSERT INTO `table` (`column`) VALUES('value'); DROP TABLE table;--')
Run Code Online (Sandbox Code Playgroud)
可以采取哪些措施来防止这种情况发生?
考虑:
$a = 'How are you?';
if ($a contains 'are')
echo 'true';
Run Code Online (Sandbox Code Playgroud)
假设我有上面的代码,编写语句的正确方法是什么if ($a contains 'are')
?
为什么一个人不应该使用mysql_*
功能的技术原因是什么?(例如mysql_query()
,mysql_connect()
或mysql_real_escape_string()
)?
即使他们在我的网站上工作,为什么还要使用其他东西?
如果他们不在我的网站上工作,为什么我会收到错误
警告:mysql_connect():没有这样的文件或目录
有没有一种简单的方法可以使用PHP从数组中删除元素,这样foreach ($array)
就不再包含该元素了?
我认为设置它null
会这样做,但显然它不起作用.
如果我有YouTube视频网址,有没有办法使用PHP和cURL从YouTube API获取相关缩略图?
如何解析HTML/XML并从中提取信息?
让我通过说我知道它是什么foreach
,做什么以及如何使用它来加上前缀.这个问题涉及它如何在发动机罩下工作,我不希望任何答案都是"这就是你如何循环阵列foreach
".
很长一段时间,我认为这foreach
与数组本身一起工作.然后我发现许多引用它的数据副本的事实,我已经假设这是故事的结尾.但是我最近讨论了这个问题,经过一些实验后发现这实际上并非100%正确.
让我说明我的意思.对于以下测试用例,我们将使用以下数组:
$array = array(1, 2, 3, 4, 5);
Run Code Online (Sandbox Code Playgroud)
foreach ($array as $item) {
echo "$item\n";
$array[] = $item;
}
print_r($array);
/* Output in loop: 1 2 3 4 5
$array after loop: 1 2 3 4 5 1 2 3 4 5 */
Run Code Online (Sandbox Code Playgroud)
这清楚地表明我们不直接使用源数组 - 否则循环将永远持续,因为我们在循环期间不断地将项目推送到数组.但只是为了确保这种情况:
foreach ($array as $key => $item) {
$array[$key + 1] = $item + 2;
echo "$item\n";
}
print_r($array);
/* Output …
Run Code Online (Sandbox Code Playgroud) 我检查了我的php.ini
文件,并设置了显示错误,还有错误报告display_errors
.我重新启动了我的Apache Web服务器.
我甚至把这些行放在我的脚本的顶部,它甚至没有捕获简单的解析错误.例如,我使用a声明变量,E_ALL
而不是关闭语句"$"
.但是我的所有脚本都显示这些错误的空白页面,但我想在浏览器输出中看到错误.
error_reporting(E_ALL);
ini_set('display_errors', 1);
Run Code Online (Sandbox Code Playgroud)
还剩下什么?