참조-이 오류는 PHP에서 무엇을 의미합니까?


1137

이게 뭐야?

이것은 PHP를 프로그래밍 할 때 발생할 수있는 경고, 오류 및주의 사항에 대한 많은 답변이며이를 해결하는 방법에 대한 실마리는 없습니다. 이것은 커뮤니티 위키이기도하므로 모든 사람이이 목록에 추가하고 유지 관리하는 데 참여하도록 초대됩니다.

왜 이런거야?

"이미 보낸 헤더" 또는 "비 객체의 구성원에게 전화 걸기 " 와 같은 질문 은 스택 오버플로에서 자주 나타납니다. 이러한 질문의 근본 원인은 항상 같습니다. 따라서 이러한 질문에 대한 답변은 일반적으로 반복되며 특정 사례에서 변경할 행을 OP로 표시합니다. 이 답변은 OP의 특정 코드에만 적용되므로 사이트에 가치를 더하지 않습니다. 같은 오류를 가진 다른 사용자는 너무 현지화되어 있으므로 솔루션을 쉽게 읽을 수 없습니다. 근본 원인을 이해하면 오류를 수정하는 것이 쉽지 않기 때문에 슬픈 일입니다. 따라서이 목록은 솔루션을 일반적인 방식으로 설명하려고 시도합니다.

여기서 무엇을해야합니까?

질문이이 질문과 중복 된 것으로 표시되면 아래 오류 메시지를 찾아 코드에 수정 사항을 적용하십시오. 답변에는 일반적으로 일반적인 답변만으로는 명확하지 않아야 할 경우 조사 할 추가 링크가 포함되어 있습니다.

기고하려면 "즐겨 찾기"오류 메시지, 경고 또는 알림, 답변 당 하나씩, 의미에 대한 간단한 설명 (매뉴얼 페이지의 용어 만 강조 표시되는 경우에도), 가능한 솔루션 또는 디버깅 방법 및 가치가있는 기존 Q & A 목록. 또한 기존 답변을 자유롭게 개선하십시오.

리스트

또한 다음을 참조하십시오.


7
또한, 코멘트에서 논의를 이동로 이동하시기 바랍니다 메타 질문
Earlz



답변:


275

경고 : 헤더 정보를 수정할 수 없습니다-헤더가 이미 전송되었습니다

스크립트가 클라이언트에 HTTP 헤더를 보내려고하지만 이전에 이미 출력이 있었기 때문에 헤더가 이미 클라이언트로 전송되었습니다.

이것은 E_WARNING스크립트이며 스크립트를 중지하지 않습니다.

일반적인 예는 다음과 같은 템플릿 파일입니다.

<html>
    <?php session_start(); ?>
    <head><title>My Page</title>
</html>
...

session_start()함수는 세션 쿠키가있는 헤더를 클라이언트에 보내려고합니다. 그러나 PHP는 <html>요소를 출력 스트림에 쓸 때 이미 헤더를 보냈습니다 . 를 session_start()맨 위로 이동 해야합니다.

코드가 경고를 트리거 하기 전에 행을 통과하여 출력되는 위치를 확인 하여이 문제를 해결할 수 있습니다 . 해당 코드 전에 헤더 전송 코드를 이동하십시오.

종종 간과되는 출력은 PHP가 닫힌 후 새로운 줄 ?>입니다. ?>파일에서 마지막 일 때 생략하는 것이 표준 관행으로 간주 됩니다. 마찬가지로,이 경고의 또 다른 일반적인 원인은 개구부에 <?php공백, 줄 또는 보이지 않는 문자가 있기 때문에 웹 서버가 헤더와 공백 / 줄 바꾸기를 보내서 PHP가 구문 분석을 시작할 때 제출할 수없는 경우입니다 모든 헤더.

파일에 둘 이상의 <?php ... ?>코드 블록이 있으면 그 사이에 공백이 없어야합니다. (참고 : 자동으로 생성 된 코드가있는 경우 여러 블록이있을 수 있습니다)

또한 스크립트의 인코딩이 BOM을 사용하는 UTF-8 인 경우 코드에 바이트 순서 표시가 없는지 확인하십시오.

관련 질문 :


2
WordPress를 사용하는 경우 테마 파일을 확인하십시오. 사이트를 새 버전의 WordPress로 업그레이드 할 때 테마가 몇 년 동안 업데이트되지 않아서 업데이트 할 수 없었습니다. 이 문제가 발생했습니다. functions.php 파일에 둘 이상의 <? ?> 사이에 공백이있는 블록.
Roy Leban

2
@RoyLeban "파일에 둘 이상의 블록이 있으면 ..."이것이 무엇을 의미하는지 잘 모르겠습니다. "블록"이란 무엇입니까? 하나의 블록이 구성 <?php ?>되어 "하나 이상의 블록"은 <?php ?> <?php ?>무엇입니까?
Andrew Fox

2
가능한 경우 PHP.ini 구성 파일에서 '출력 버퍼링'기능을 켜십시오.이 문제를 해결하는 데 사용됩니다 .html 파일이 출력 버퍼에 저장되고 스크립트가 중지 된 후에 만 ​​클라이언트로 전송됩니다. 헤더는 다른 위치에 발행되며 이전 헤더는 새 헤더로 바뀝니다.
Nidhin David

191

치명적 오류 : 개체가 아닌 멤버 함수에 대한 호출

객체가 아니고 호출 할 수없는 xyz->method()위치 와 유사한 코드 xyz가 발생합니다 method.

이것은 스크립트를 중지시키는 치명적인 오류입니다 (앞으로 호환성 고지 : PHP 7부터 캐치 가능한 오류가됩니다).

대부분의 경우 코드에 오류 조건 검사가 누락되었음을 나타냅니다. 메소드를 호출하기 전에 오브젝트가 실제로 오브젝트인지 확인하십시오.

대표적인 예로들 수

// ... some code using PDO
$statement = $pdo->prepare('invalid query', ...);
$statement->execute(...);

위의 예에서 쿼리를 준비 할 수 없으며에 prepare()할당 false됩니다 $statement. execute()그런 다음 이 메소드 를 호출하려고 false하면 값이 부울이므로 "객체가 아닌" 것이기 때문에 치명적 오류 가 발생합니다.

그림 밖으로 함수는 부울 대신 객체를 반환했습니다. 예를 들어, $pdo마지막으로 발생한 오류가 있는지 개체를 확인하십시오 . 이를 디버깅하는 방법에 대한 자세한 내용은 해당 특정 함수 / 객체 / 클래스에 대해 오류를 처리하는 방법에 따라 다릅니다.

조차도 ->prepare실패하면 $pdo데이터베이스 핸들 객체 가 현재 범위로 전달되지 않았습니다 . 정의 된 위치를 찾으십시오. 그런 다음 매개 변수로 전달하거나 특성으로 저장하거나 글로벌 범위를 통해 공유하십시오.

또 다른 문제는 조건부로 객체를 만든 다음 해당 조건부 블록 외부에서 메서드를 호출하는 것입니다. 예를 들어

if ($someCondition) {
    $myObj = new MyObj();
}
// ...
$myObj->someMethod();

조건부 블록 외부에서 메소드를 실행하려고하면 오브젝트가 정의되지 않을 수 있습니다.

관련 질문 :


115

아무것도 보이지 않습니다. 페이지가 비어 있고 흰색입니다.

죽음하얀 페이지 또는 죽음의 하얀 화면 이라고도 함 . 오류보고가 해제되고 치명적 오류 (종종 구문 오류)가 발생했을 때 발생합니다.

오류 로깅을 활성화 한 경우 오류 로그에 구체적인 오류 메시지가 표시됩니다. 이 파일은 보통 중앙 위치에있는 "php_errors.log"라는 파일에 있습니다 (예 :/var/log/apache2 많은 Linux 환경에서) 또는 스크립트 자체의 디렉토리 (때로는 공유 호스팅 환경에서 사용됨)에 있습니다.

때때로 오류 표시를 일시적으로 활성화하는 것이 더 간단한 경우가 있습니다. 그러면 흰색 페이지에 오류 메시지가 표시됩니다. 이 오류는 웹 사이트를 방문하는 모든 사람에게 표시되므로주의하십시오.

스크립트 상단에 다음 PHP 코드를 추가하면 쉽게 수행 할 수 있습니다.

ini_set('display_errors', 1); error_reporting(~0);

코드는 오류 표시를 켜고보고를 최고 수준으로 설정합니다.

는 이후 ini_set()런타임시에 실행되는 것이 분석 / 구문 오류에 아무런 효과가 없다. 이러한 오류는 로그에 나타납니다. 출력 (예 : 브라우저)에도 표시하려면 display_startup_errors지시문을 로 설정해야 합니다 true. 에 하나이 작업을 수행 php.ini하거나에서 .htaccess나에 의해 구성에 영향을 미치는 다른 방법 전에 런타임 .

동일한 방법을 사용하여 log_errorserror_log 지시문을 설정 하여 고유 한 로그 파일 위치를 선택할 수 있습니다.

로그를 보거나 디스플레이를 사용하면 훨씬 더 나은 오류 메시지와 스크립트가 중단되는 코드 줄이 나타납니다.

관련 질문 :

관련 오류 :


3
error_reporting(~0);왜 안돼 -1? 그것이 ~0평가하는 것이며 훨씬 덜 비밀입니다.
Fabrício Matté

3
둘 다 비슷하게 비밀스러워합니다. ~0보다 명확한 IMO : 빈 비트 세트를 무효화합니다 . 즉, 모든 플래그를 활성화 합니다 . -1은 C의 strpos ()에서와 같이«찾을 수 없음»을 의미하는 것이 아니라 -1이 이진 1111'1111'1111'1111(32 비트) 이기 때문에 모든 플래그가 설정된 비트 세트 입니다.
nalply

2
죄송합니다. 1111'1111'1111'1111실제로 16 비트이지만 내 말의 의미를 이해하시기 바랍니다.
nalply

3
5.4 이전 버전의 경우 @IvanSolntsev E_STRICT은 (는)에 포함되어 있지 않습니다 E_ALL. php.net/manual/en/errorfunc.constants.php에서 아래로 스크롤하십시오 E_STRICT.
nalply

102

통지 : 정의되지 않은 색인

배열에없는 키로 배열에 액세스하려고하면 발생합니다.

Undefined Index공지 의 일반적인 예는 ( demo )입니다.

$data = array('foo' => '42', 'bar');
echo $data['spinach'];
echo $data[1];

모두 spinach1이 원인이되는 배열에 존재하지 않는 E_NOTICE트리거 될 수 있습니다.

해결책은 해당 인덱스에 액세스하기 전에 인덱스 또는 오프셋이 존재하는지 확인하는 것입니다. 이는 예상 할 때 해당 색인이 존재하도록 프로그램의 버그를 수정해야 함을 의미 할 수 있습니다. 아니면 인덱스를 사용하여 존재 여부를 테스트 할 필요가 있음을 의미 할 수 있습니다 array_key_exists또는 isset:

$data = array('foo' => '42', 'bar');
if (array_key_exists('spinach', $data)) {
    echo $data['spinach'];
}
else {
    echo 'No key spinach in the array';
}

다음과 같은 코드가 있다면 :

<?php echo $_POST['message']; ?>
<form method="post" action="">
    <input type="text" name="message">
    ...

다음 $_POST['message']이 페이지가 처음로드 될 때 설정되지 않습니다 그리고 당신은 위의 오류가 발생합니다. 양식이 제출되고이 코드가 두 번째로 실행될 때만 배열 색인이 존재합니다. 일반적으로 다음을 확인하십시오.

if ($_POST)  ..  // if the $_POST array is not empty
// or
if ($_SERVER['REQUEST_METHOD'] == 'POST') ..  // page was requested with POST

관련 질문 :


나는 사용하는 경향이있다if(!empty($_POST['message'])){ //do stuff }
kurdtpage

85

경고 : mysql_fetch_array ()는 매개 변수 1이 리소스가 될 것으로 예상합니다.

맨 먼저:

mysql_*새 코드 에서는 함수를 사용하지 마십시오 . 더 이상 유지 관리되지 않으며 공식적으로 더 이상 사용되지 않습니다 . 참고 항목 빨간색 상자 ? 에 대해 알아 준비된 문 대신 사용할 PDO 또는 MySQLi를 - 이 기사는 당신이 어떤을 결정하는 데 도움이됩니다. PDO를 선택하면 다음 은 좋은 튜토리얼 입니다.


이것은 결과에서 데이터를 가져 오려고 mysql_query하지만 쿼리에 실패한 경우에 발생합니다.

이것은 경고이며 스크립트를 중지 시키지는 않지만 프로그램을 잘못 만듭니다.

mysql_query의해 반환 된 결과를 확인해야합니다

$res = mysql_query($sql);
if (!$res) {
   die(mysql_error());
}
// after checking, do the fetch

관련 질문 :

관련 오류 :

mysql*MySQL 결과 리소스를 매개 변수로 사용하는 다른 함수도 같은 이유로 같은 오류가 발생합니다.


5
그냥 참고하십시오. mysql_query충분히 나쁘지 않은 경우 or die그 위에 추가하면 부상을 입을 수 있습니다.
Madara 's Ghost

내가 겪는 문제는 $res = mysql_query($query)쿼리가 성공하면 1을 반환하므로 참으로 간주됩니다. 따라서 결과 통과 할 때 mysql_query 까지 mysql_fetch_array() 통지를 나타낸다.
mboy

@mboy SELECT, SHOW, DESCRIBE, EXPLAIN 및 결과 집합을 반환하는 다른 문의 경우 mysql_query ()는 성공시 리소스를 반환하고 오류시 FALSE를 반환합니다. 다른 유형의 SQL 문 (INSERT, UPDATE, DELETE, DROP 등)의 경우, mysql_query ()는 성공하면 TRUE를, 오류이면 FALSE를 리턴합니다.
xdazz

@xdazz 그것이 직면하고있는 문제입니다. Insert update는 TRUE를 반환 하므로이 오류 mysql_fetch_array() expects parameter 1 to be resource, boolean given in select 를 제거 할 수 없습니다 -gist.github.com/romelemperado/93af4cdbd44ebf3a07cbfa0e3fc539d7 참조이 오류 를 제거하기위한 제안?
mboy

2
@mboy mysql_fetch_array()는 선택 쿼리, 삽입 및 업데이트를 위해 결과 집합을 가져올 필요가 없으며 결과 집합을 가져올 수 없습니다.
xdazz

79

치명적 오류 : 개체 컨텍스트에 없을 때 $ this 사용

$this할당 할 수없는 PHP의 특수 변수입니다 . 존재하지 않는 컨텍스트에서 액세스하면이 치명적인 오류가 발생합니다.

이 오류가 발생할 수 있습니다 :

  1. 비 정적 메소드가 정적으로 호출되는 경우. 예:

    class Foo {
       protected $var;
       public function __construct($var) {
           $this->var = $var;
       }
    
       public static function bar () {
           // ^^^^^^
           echo $this->var;
           //   ^^^^^
       }
    }
    
    Foo::bar();

    수정 방법 : 코드를 다시 검토$this하고 객체 컨텍스트에서만 사용할 수 있으며 정적 메서드에는 사용해서는 안됩니다. 또한 정적 메서드는 정적이 아닌 속성에 액세스하면 안됩니다. self::$static_property정적 속성에 액세스하는 데사용합니다.

  2. 클래스 메소드의 코드는 정상적인 기능하거나 전역으로 복사 된 경우 지키는 $this특별한 변수.
    수정 방법 : 코드를 검토하고 $this다른 대체 변수로 바꾸십시오 .

관련 질문 :

  1. 정적이 아닌 메소드를 정적으로 호출 : PHP 치명적 오류 : 객체 컨텍스트에 없을 때 $ this 사용
  2. 코드 복사 : 치명적인 오류 : 개체 컨텍스트에 없을 때 $ this 사용
  3. "객체 컨텍스트에 있지 않을 때 $ this 사용"질문

2
또한 정적이 아닌 메소드에서도 클로저로 작동하는 방식과 5.4에서 "고정"되는 방식에 대해 언급 할 수 있습니다.
Kendall Hopkins

2
@hakre 클로저 내부의 정적 호출에 대해 이야기하고있었습니다. 처럼 $closure = function() { self::method(); }.
Kendall Hopkins

2
@KendallHopkins : 다른 오류 : "치명적 오류 : 자체 액세스 할 수 없음 :: 클래스 범위가 활성화되지 않은 경우" 그러나 "치명적 오류 : 오브젝트 컨텍스트에 있지 않을 때 $ this 사용"을$this 트리거 할 수 있습니다 .$closure = function() { $this->method(); };
hakre

75

치명적인 오류 : 정의되지 않은 함수 XXX에 대한 호출

아직 정의되지 않은 함수를 호출하려고하면 발생합니다. 일반적인 원인에는 누락 된 확장이 포함되며 조건부 함수 선언, 함수 선언의 함수 또는 간단한 오타가 포함됩니다.

예 1-조건부 함수 선언

$someCondition = false;
if ($someCondition === true) {
    function fn() {
        return 1;
    }
}
echo fn(); // triggers error

이 경우, 사실이 아니므 fn()로 선언 $someCondition되지 않습니다.

예 2-함수 선언의 함수

function createFn() 
{
    function fn() {
        return 1;
    }
}
echo fn(); // triggers error

이 경우 fn한 번만 createFn()호출됩니다. 이후에 호출 createFn()하면 기존 함수의 재 선언에 대한 오류가 발생합니다.

PHP 내장 함수에 대해서도이 내용을 볼 수 있습니다. 공식 매뉴얼 에서 함수를 검색하여 어떤 "확장"(PHP 모듈)이 속하는지, 그리고 어떤 PHP 버전을 지원하는지 확인하십시오.

확장이없는 경우 해당 확장을 설치하고 php.ini에서 활성화하십시오. 기능이 표시되는 확장에 대해서는 PHP 매뉴얼의 설치 지침을 참조하십시오. 패키지 관리자 (예 : apt데비안 또는 우분투, yumRed Hat 또는 CentOS) 또는 제어판을 사용하여 확장을 활성화하거나 설치할 수 있습니다 공유 호스팅 환경에서.

함수가 사용중인 PHP의 최신 버전에 도입 된 경우 매뉴얼 또는 주석 섹션에서 대체 구현에 대한 링크를 찾을 수 있습니다. PHP에서 제거 된 경우 더 이상 필요하지 않을 수있는 이유에 대한 정보를 찾으십시오.

포함이 누락 된 경우 함수를 호출하기 전에 함수를 선언하는 파일을 포함시켜야합니다.

오타의 경우 오타를 수정하십시오.

관련 질문 :


73

구문 분석 오류 : 구문 오류, 예기치 않은 T_XXX

토큰 이 있으면 발생T_XXX예기치 않은 곳에 있고, 불균형 (불필요한) 괄호, php.ini에서 활성화하지 않고 짧은 태그 사용 등을 .

관련 질문 :

추가 도움이 필요하면 다음을 참조하십시오.


70

치명적인 오류 : 쓰기 컨텍스트에서 함수 반환 값을 사용할 수 없습니다

일반적으로와 함께 함수를 사용할 때 발생합니다 empty.

예:

if (empty(is_null(null))) {
  echo 'empty';
}

empty함수가 아닌 언어 구조 이기 때문에 5.5 이전의 PHP 버전에서는 인수로 표현식으로 호출 할 수 없습니다. PHP 5.5 이전의 인수 empty()variable 이어야 하지만 PHP 5.5+에서는 임의의 표현식 (예 : 함수의 반환 값)이 허용됩니다.

empty이름에도 불구하고 실제로 변수가 "비어 있는지"확인하지 않습니다. 대신 변수가 존재하지 않는지 확인합니다 == false. 식 ( is_null(null)예 와 같이 )은 항상 존재하는 것으로 간주되므로 여기 empty에서 false인지 확인하는 것입니다. empty()여기를 !예를 들어로 바꾸 if (!is_null(null))거나 명시 적으로 거짓을 예를 들어 비교할 수 if (is_null(null) == false)있습니다.

관련 질문 :


64

MySQL : SQL 구문에 오류가 있습니다. ... ... at line ... 근처에서 올바른 구문을 사용하려면 MySQL 서버 버전에 해당하는 설명서를 확인하십시오.

이 오류는 종종 MySQL 쿼리에 전달 된 데이터를 올바르게 이스케이프하지 않았기 때문에 발생합니다.

하지 말아야 할 일 의 예 ( "나쁜 생각") :

$query = "UPDATE `posts` SET my_text='{$_POST['text']}' WHERE id={$_GET['id']}";
mysqli_query($db, $query);

이 코드는 http://example.com/edit.php?id=10 (소식 n ° 10 수정) 과 같은 URL과 함께 제출 양식이있는 페이지에 포함될 수 있습니다.

제출 한 텍스트에 작은 따옴표가 포함되어 있으면 어떻게됩니까? $query결국 :

$query = "UPDATE `posts` SET my_text='I'm a PHP newbie' WHERE id=10';

그리고이 쿼리가 MySQL로 전송되면 중간에 여분의 작은 따옴표가 있기 때문에 구문이 잘못되었다고 불평합니다.

이러한 오류를 피하려면 쿼리에 사용하기 전에 항상 데이터를 이스케이프 해야 합니다.

SQL 쿼리에 사용하기 전에 데이터를 이스케이프하는 것도 중요합니다. 그렇지 않으면 스크립트가 SQL 삽입에 노출되기 때문입니다. SQL 삽입은 레코드, 테이블 또는 전체 데이터베이스의 변경, 손실 또는 수정을 유발할 수 있습니다. 이것은 매우 심각한 보안 문제입니다!

선적 서류 비치:


3
또한 귀하의 사이트가 봇에 의해 자동으로 해킹 될 것입니다
apscience

2
@gladoscc "편집"을 클릭하고 답을 수정하십시오. 나는 그것이 향상 될 수 있다는 것을 알고 있습니다.
Jocelyn

2
또는 준비된 SQL 쿼리를 사용하십시오.
Matej

53

치명적인 오류 : 허용 된 XXX 바이트 메모리 크기가 소진되었습니다 (XXX 바이트 할당 시도).

스크립트를 실행할 메모리가 부족합니다. PHP가 메모리 한계에 도달하여 실행을 중지합니다. 이 오류는 치명적이며 스크립트가 중지됩니다. 메모리 제한 값은 php.ini파일 또는 ini_set('memory_limit', '128 M');스크립트에서 를 사용하여 구성 할 수 있습니다 (에 정의 된 값을 덮어 씁니다 php.ini). 메모리 제한의 목적은 단일 PHP 스크립트가 사용 가능한 모든 메모리를 고갈시키고 전체 웹 서버를 다운시키는 것을 방지하는 것입니다.

가장 먼저 할 일은 스크립트에 필요한 메모리 양을 최소화하는 것입니다. 예를 들어 큰 파일을 변수로 읽거나 데이터베이스에서 많은 레코드를 가져 와서 배열에 모두 저장하는 경우 많은 메모리를 사용할 수 있습니다. 코드를 변경하여 파일을 한 줄씩 읽거나 데이터베이스 레코드를 모두 메모리에 저장하지 않고 한 번에 하나씩 가져 오십시오. 이를 위해서는 비하인드 스토리가 진행되는 상황과 데이터가 메모리와 다른 곳에 저장 될 때 약간의 개념적 인식이 필요합니다.

스크립트가 메모리 집약적 인 작업을 수행하지 않을 때이 오류가 발생하면 코드가 메모리 누수가 있는지 확인해야합니다. 이 memory_get_usage기능은 당신의 친구입니다.

관련 질문 :


53

구문 분석 오류 : 구문 오류, 예기치 않은 T_ENCAPSED_AND_WHITESPACE

이 오류는 전체 복잡한 변수 구문이로 묶이지 않은 경우 큰 따옴표로 묶인 문자열 내에서 보간을 위해 따옴표로 묶인 키로 배열 값을 참조하려고 할 때 가장 자주 발생 {}합니다.

오류 사례 :

결과는 Unexpected T_ENCAPSED_AND_WHITESPACE다음 과 같습니다.

echo "This is a double-quoted string with a quoted array key in $array['key']";
//---------------------------------------------------------------------^^^^^

가능한 수정 사항 :

큰 따옴표로 묶인 문자열에서 PHP는 배열 키 문자열을 인용 부호 없이 사용할 수있게 하며을 발행하지 않습니다 E_NOTICE. 위의 내용은 다음과 같이 쓸 수 있습니다.

echo "This is a double-quoted string with an un-quoted array key in $array[key]";
//------------------------------------------------------------------------^^^^^

전체 컴플렉스 배열 변수 및 키 (들)에 봉입 할 수 {}있는 경우, 그들은 한다 않도록 인용 E_NOTICE. PHP 문서 는 복잡한 변수에 대해이 구문을 권장합니다.

echo "This is a double-quoted string with a quoted array key in {$array['key']}";
//--------------------------------------------------------------^^^^^^^^^^^^^^^
// Or a complex array property of an object:
echo "This is a a double-quoted string with a complex {$object->property->array['key']}";

물론, 위의 어떤 것의 대안 은 배열 변수를 보간하는 대신 연결하는 것입니다.

echo "This is a double-quoted string with an array variable". $array['key'] . " concatenated inside.";
//----------------------------------------------------------^^^^^^^^^^^^^^^^^^^^^

참고로, 섹션 참조 변수 구문 분석 에서 PHP는 문자열 매뉴얼 페이지를


45

경고 : [기능] : 스트림을 열지 못했습니다 : [이유]

일반적으로 파일을 호출하면 발생합니다. include , require또는fopen 및 PHP 파일을 찾거나 파일을로드하는 것만으로는 충분하지 권한이 없습니다.

이것은 여러 가지 이유로 발생할 수 있습니다.

  • 파일 경로가 잘못되었습니다
  • 파일 경로는 상대적입니다
  • 포함 경로가 잘못되었습니다
  • 권한이 너무 제한적입니다
  • SELinux가 시행 중
  • 그리고 더 많은 ...

일반적인 실수 중 하나는 절대 경로를 사용하지 않는 것입니다. 또는 다음 과 같은 전체 경로 또는 마법 상수 를 사용하여 쉽게 해결할 수 있습니다 .__DIR__dirname(__FILE__)

include __DIR__ . '/inc/globals.inc.php';

또는:

require dirname(__FILE__) . '/inc/globals.inc.php';

올바른 경로를 사용하는 것은 이러한 문제를 해결하는 한 단계이며, 존재하지 않는 파일, 파일 시스템의 권한, PHP 자체의 액세스 또는 오픈 기반 제한을 막을 수 있습니다.

이 문제를 신속하게 해결하는 가장 좋은 방법은 아래의 문제 해결 점검 목록을 따르는 것입니다.

관련 질문 :

관련 오류 :


44

구문 분석 오류 : 구문 오류, 예기치 않은 T_PAAMAYIM_NEKUDOTAYIM

범위 확인 연산자는 히브리어 פעמיים נקודתיים에서 "Paamayim Nekudotayim"이라고도합니다. "이중 콜론"을 의미합니다.

이 오류는 일반적으로 실수로 ::코드를 입력 한 경우에 발생합니다 .

관련 질문 :

선적 서류 비치:


이 오류를 발생시키는 가장 쉬운 방법은 a()::b;또는을 실행하는 것 $a=::;입니다.
Ismael Miguel

43

고지 : 정의되지 않은 상수 XXX 사용- 'XXX'로 가정

또는 PHP 7.2 이상에서 :

경고 : 정의되지 않은 상수 XXX 사용- 'XXX'로 가정 (이후 PHP 버전에서 오류가 발생 함)

이 알림은 토큰이 코드에서 사용되고 상수 인 것처럼 보이지만 해당 이름의 상수는 정의되지 않은 경우에 발생합니다.

이 공지의 가장 일반적인 원인 중 하나는 연관 배열 키로 사용되는 문자열을 인용하지 못한 것입니다.

예를 들면 다음과 같습니다.

// Wrong
echo $array[key];

// Right
echo $array['key'];

또 다른 일반적인 원인은 $변수 이름 앞에 누락 된 (달러) 부호입니다.

// Wrong
echo varName;

// Right
echo $varName;

또는 다른 상수 또는 키워드의 철자를 잘못 입력했을 수도 있습니다.

// Wrong
$foo = fasle;

// Right
$foo = false;

또한 해당 라이브러리에 의해 정의 된 상수에 액세스하려고 할 때 필요한 PHP 확장 또는 라이브러리가 없다는 표시 일 수 있습니다.

관련 질문 :


2
가장 일반적인 원인은 배열이 아닌 변수 앞에서 $를 잊어 버린 것이라고 말합니다.
Overv

42

치명적인 오류 : 클래스를 다시 선언 할 수 없습니다 [클래스 이름]을

치명적인 오류 : 다시 선언 할 수 없습니다 [함수 이름]을

중 하나를 두 번 같은 기능 / 클래스 이름을 사용하고 그 중 하나의 이름을 바꿀 필요하거나 사용했기 때문에 그것이있는 당신이 수단 require또는 include사용 할 위치 require_onceinclude_once.

PHP에서 클래스 또는 함수가 선언되면 변경할 수 없으며 나중에 새 값으로 선언 할 수 없습니다.

다음 코드를 고려하십시오.

class.php

<?php

class MyClass
{
    public function doSomething()
    {
        // do stuff here
    }
}

index.php

<?php

function do_stuff()
{
   require 'class.php';
   $obj = new MyClass;
   $obj->doSomething();
}

do_stuff();
do_stuff();

두 번째 호출 do_stuff()은 위의 오류를 생성합니다. 변경하면 requirerequire_once, 우리의 정의가 포함 된 파일 것을 확신 할 수 MyClass한 번만로드됩니다, 그리고 오류를 피할 수 있습니다.


3
자동 로딩을 사용하는 것에 대해 언급 할 가치가 있으며 PSR-4 와 같은 표준 또는 더 이상 사용되지 않는 PSR-0 조차도 필요 / 포함을 필요로하지 않아도되므로이를 거의 제거 할 수 있습니다 (몇 가지 기괴한 경우는 제외).
DanielM

39

통지 : 정의되지 않은 변수

이전에 정의되지 않은 변수를 사용하려고하면 발생합니다.

전형적인 예는

foreach ($items as $item) {
    // do something with item
    $counter++;
}

정의하지 않은 경우 $counter이전에 위의 코드가 알림을 트리거합니다.

올바른 방법은 변수가 빈 문자열 인 경우에도 변수를 사용하기 전에 설정하는 것입니다

$counter = 0;
foreach ($items as $item) {
    // do something with item
    $counter++;
}

통지 : 정의되지 않은 속성

이 오류는 거의 같은 의미이지만 개체의 속성을 나타냅니다. 위의 예제를 재사용하면이 코드는 counter속성이 설정되지 않았기 때문에 오류를 트리거합니다 .

$obj = new stdclass;
$obj->property = 2342;
foreach ($items as $item) {
    // do something with item
    $obj->counter++;
}

관련 질문 :


35

구문 분석 오류 : 구문 오류, 예기치 않은 T_VARIABLE

가능한 시나리오

내 코드가 잘못 된 곳을 찾을 수없는 것 같습니다. 내 전체 오류는 다음과 같습니다.

구문 분석 오류 : 구문 오류, x 행의 예기치 않은 T_VARIABLE

내가 시도하는 것

$sql = 'SELECT * FROM dealer WHERE id="'$id.'"';

대답

구문 분석 오류 : 명령문 끝에서 세미콜론을 남겨 두거나 위의 경우와 같이 .연산자가 없는 등의 프로그램 구문에 문제가 있습니다. 구문 분석 오류가 발생하면 인터프리터가 프로그램 실행을 중지합니다.

간단히 말해서 이것은 구문 오류입니다. 즉, 코드에 올바르게 구문 분석되어 실행되지 못하게하는 무언가가 있음을 의미합니다.

당신이해야 할 일은 간단한 실수에 대한 오류가있는 줄을주의 깊게 점검하는 입니다.

이 오류 메시지는 파일의 x 행에서 PHP 인터프리터가 열린 괄호를 볼 것으로 예상했지만 대신이라는 것을 발견했습니다 T_VARIABLE. 그 T_VARIABLE것을이라고합니다 token. PHP 인터프리터가 프로그램의 다른 기본 부분을 표현하는 방법입니다. 통역사가 프로그램을 읽으면 작성한 내용을 토큰 목록으로 변환합니다. 프로그램에 변수를 넣을 때마다 T_VARIABLE통역사 목록에 토큰이 있습니다.

잘 읽음 : 파서 ​​토큰 목록

적어도 E_PARSE에서 활성화해야 합니다 php.ini. 프로덕션 스크립트에는 구문 분석 오류가 없어야합니다.

코딩하는 동안 항상 다음 문장을 추가하는 것이 좋습니다.

error_reporting(E_ALL);

PHP 오류보고

또한 입력하는 동안 구문 분석 오류를 알려주는 IDE를 사용하는 것이 좋습니다. 당신이 사용할 수있는:

  1. NetBeans (좋은 아름다움, 무료 소프트웨어) (내 의견으로는 최고)
  2. PhpStorm (Gordon 아저씨는 이것을 좋아합니다 : P, 유료 요금제, 독점 및 무료 소프트웨어 포함)
  3. 이클립스 (미녀와 야수, 자유 소프트웨어)

관련 질문 :


34

주의 : 초기화되지 않은 문자열 오프셋 : *

이름에서 알 수 있듯이, 존재하지 않는 키를 가진 배열에서 값을 반복하거나 찾으려고 할 때 이러한 유형의 오류가 발생합니다.

당신을 고려하여 모든 편지를 보여 주려고합니다. $string

$string = 'ABCD'; 
for ($i=0, $len = strlen($string); $i <= $len; $i++){
    echo "$string[$i] \n"; 
}

위 예제는 ( online demo )를 생성합니다 :

A
B
C
D
Notice: Uninitialized string offset: 4 in XXX on line X

그리고, 곧 반향 스크립트 완료로 D내부에 있기 때문에 당신이 오류를 얻을 수 있습니다 for()루프, 당신이에서 다섯 번째 문자와로 처음부터 당신에게 보여 PHP를 말한 'ABCD', 어떤이 존재하지만, 루프 시작 이후부터 계산합니다 0및 에코 D에 도달 할 때까지 4오프셋 오류가 발생합니다.

비슷한 오류 :


32

알림 : 객체가 아닌 오류의 속성을 가져 오려고합니다.

객체가없는 상태에서 객체의 속성에 액세스하려고하면 발생합니다.

비 객체 통지의 일반적인 예는 다음과 같습니다.

$users = json_decode('[{"name": "hakre"}]');
echo $users->name; # Notice: Trying to get property of non-object

이 경우, $users배열 (객체가 아님)이며 속성이 없습니다.

이것은 존재하지 않는 인덱스 또는 배열의 키에 액세스하는 것과 유사합니다 (주의 사항 : 정의되지 않은 인덱스 참조 ).

이 예는 훨씬 간단합니다. 대부분의 경우 이러한 통지는 검사되지 않은 반환 값을 나타냅니다. 예를 들어 NULL, 객체가 존재하지 않거나 예상치 못한 비 객체 값 (예 : Xpath 결과, 예기치 않은 형식의 JSON 구조, 예기치 않은 형식의 XML 등) 에서 라이브러리가 반환되는 경우 그러나 코드는 그러한 조건을 확인하지 않습니다.

이러한 비 객체는 종종 추가로 처리되므로 종종 비 객체에서 객체 메소드를 호출 할 때 치명적 오류가 발생합니다 ( 치명적 오류 : 비 객체에서 멤버 함수 호출 ... 참조). ) 스크립트.

오류 조건을 확인하거나 변수가 예상과 일치하면 쉽게 예방할 수 있습니다. 여기 DOMXPath 예제 와 같은 통지가 있습니다 .

$result  = $xpath->query("//*[@id='detail-sections']/div[1]");
$divText = $result->item(0)->nodeValue; # Notice: Trying to get property of non-object

컬렉션 nodeValue에 존재하는지 여부를 확인하지 않은 상태에서 첫 번째 항목 의 속성 (필드)에 액세스하는 데 문제가 $result있습니다. 대신 코드가 작동하는 객체에 변수를 할당하여 코드를보다 명확하게하기 위해 비용을 지불합니다.

$result  = $xpath->query("//*[@id='detail-sections']/div[1]");
$div     = $result->item(0);
$divText = "-/-";
if (is_object($div)) {
    $divText = $div->nodeValue;
}
echo $divText;

관련 오류 :


1
json_decode이제 stdclass기본적으로 인스턴스를 반환 하므로 예제 코드 실제로 작동합니다.
Hugo Zink이

@HugoZink : 그것은 실제로 예를 들어 배열 반환 (않았다 항상 등)을 수행합니다 3v4l.org/SUDe0을 - 당신은 당신의 쓰기 참조 주시기 바랍니다 수 있습니다 또한 " json_decode지금의 인스턴스를 반환 stdclass기본적으로"를 ? 변경 로그에서 찾을 수 없습니다.
hakre

json_decode 의 PHP 매뉴얼 페이지에 따르면 기본적으로 assoc매개 변수는 false로 설정되어 있습니다. 이 매개 변수는 함수가 stdclass연관 배열 대신 함수를 리턴하는지 여부를 결정합니다 .
Hugo Zink가

json_decode('[{"name": "hakre"}]', true), 그렇지 않으면 배열을 반환합니다 stdclass개체
zanderwar

29

경고 : open_basedir 제한 적용

이 경고는 파일 및 디렉토리 액세스와 관련된 다양한 기능과 함께 나타날 수 있습니다. 구성 문제에 대해 경고합니다.

표시되면 일부 파일에 대한 액세스가 금지되었음을 나타냅니다.

경고 자체는 아무 것도 깨지 않지만 파일 액세스가 금지 된 경우 대부분 스크립트가 제대로 작동하지 않습니다.

수정은 일반적으로 PHP 구성 을 변경하는 것이며 관련 설정은open_basedir 합니다.

때로는 잘못된 파일 또는 디렉토리 이름이 사용 된 경우 올바른 이름을 사용하도록 수정합니다.

관련 질문 :


1
이것은 공유 호스트에서 가장 자주 발생하며 사람들은 보통 디렉토리에서 자신을 잠그지 않습니다 :-)
uınbɐɥs

28

구문 분석 오류 : 구문 오류, 예기치 않은 '['

이 오류는 두 가지 variatian에서 발생합니다.

변형 1

$arr = [1, 2, 3];

이 배열 초기화 구문은 PHP 5.4에서만 소개되었습니다. 그 이전 버전에서는 파서 오류가 발생합니다. 가능하면 설치를 업그레이드하거나 이전 구문을 사용하십시오.

$arr = array(1, 2, 3);

매뉴얼 에서이 예제 를 참조하십시오 .

변형 2

$suffix = explode(',', 'foo,bar')[1];

배열 역 참조 함수 결과도 PHP 5.4에 도입되었습니다. 업그레이드 할 수없는 경우 (임시) 변수를 사용해야합니다.

$parts = explode(',', 'foo,bar');
$suffix = $parts[1];

매뉴얼 에서이 예제 를 참조하십시오 .


23

경고 : [기능] 는 매개 변수 1이 자원이 될 것으로 예상

( 경고 의 더 일반적인 변형 : mysql_fetch_array ()는 매개 변수 1이 리소스가 될 것으로 예상합니다. )

리소스는 PHP 의 유형 (예 : 문자열, 정수 또는 객체)입니다. 리소스는 본질적으로 의미있는 가치가없는 불투명 한 얼룩입니다. 리소스는 특정 PHP 함수 또는 확장 세트에 따라 다르며 정의됩니다. 예를 들어, Mysql 확장 은 두 가지 자원 유형을 정의합니다 .

MySQL 모듈에는 두 가지 리소스 유형이 사용됩니다. 첫 번째는 데이터베이스 연결에 대한 링크 식별자이고, 두 번째는 쿼리 결과를 보유하는 리소스입니다.

cURL 확장은 다른 두 가지 자원 유형을 정의합니다 .

... cURL 핸들과 cURL 멀티 핸들.

var_dump에드, 값은 다음과 같이 :

$resource = curl_init();
var_dump($resource);

resource(1) of type (curl)

모든 (1)유형의 리소스는 특정 유형 ( (curl)) 의 숫자 식별자 ( )입니다 .

이러한 자원을 가지고 다니고 그러한 자원이 의미하는 다른 기능으로 전달하십시오. 일반적으로 이러한 함수는 백그라운드에서 특정 데이터를 할당하며 리소스는이 데이터를 내부적으로 추적하는 데 사용하는 참조 일뿐입니다.


" ... 매개 변수 1은 자원, 부울이 주어짐 "오류는 일반적으로 자원을 작성하기로되어 있지만 false대신 리턴되는 점검되지 않은 조작의 결과입니다 . 예를 들어, fopen함수 에는 다음과 같은 설명이 있습니다.

반환 값

성공 또는 FALSE오류시 파일 포인터 리소스를 반환합니다 .

따라서이 코드에서 $fpa resource(x) of type (stream)또는 false:

$fp = fopen(...);

fopen작업의 성공 또는 실패 여부를 확인하지 않아 $fp유효한 리소스인지 또는 리소스 를 기대하는 다른 함수에 false전달 $fp하면 위의 오류가 발생할 수 있습니다.

$fp   = fopen(...);
$data = fread($fp, 1024);

Warning: fread() expects parameter 1 to be resource, boolean given

항상 자원을 할당하려고 시도하고 실패 할 수 있는 함수의 리턴 값을 오류 확인해야합니다 .

$fp = fopen(...);

if (!$fp) {
    trigger_error('Failed to allocate resource');
    exit;
}

$data = fread($fp, 1024);

관련 오류 :


22

경고 : 잘못된 문자열 오프셋 'XXX'

이것은 대괄호 구문으로 배열 요소에 액세스하려고 할 때 발생하지만 배열이 아닌 문자열 에서이 작업을 수행하므로 작업이 명확 하게 이해되지 않습니다 .

예:

$var = "test";
echo $var["a_key"];

변수가 배열이어야한다고 생각되면, 변수가 어디에서 왔는지 확인하고 문제를 해결하십시오.


20

코드가 실행되지 않거나 PHP 코드의 일부가 출력되는 것처럼 보입니다.

PHP 코드에서 어떤 결과도 얻지 못하거나 웹 페이지에 리터럴 PHP 소스 코드 출력의 일부가 표시되면 PHP가 실제로 실행되지 않는 것을 확신 할 수 있습니다. 브라우저에서 소스보기를 사용하는 경우 전체 PHP 소스 코드 파일이있는 것 같습니다. PHP 코드가 내장되어 있기 때문에<?php ?> 태그에 브라우저는 HTML 로 해석하려고 시도하므로 결과가 다소 혼란스러워 보일 수 있습니다.

실제로 PHP 스크립트를 실행하려면 다음이 필요합니다.

  • 스크립트를 실행하는 웹 서버
  • 파일 확장자를 .php로 설정하지 않으면 웹 서버에서 파일 확장자를 해석하지 않습니다 *
  • 웹 서버를 통해 .php 파일에 액세스

* 다시 구성하지 않으면 모든 것을 구성 할 수 있습니다.

이 마지막 것이 특히 중요합니다. 파일을 두 번 클릭하면 다음과 같은 주소를 사용하여 브라우저에서 파일이 열립니다.

file://C:/path/to/my/file.php

이것은 실행중인 웹 서버를 완전히 우회하고 파일이 해석되지 않습니다. 웹 서버에서 다음과 같은 파일의 URL을 방문해야합니다.

http://localhost/my/file.php

또한 짧은 오픈 태그를 <?사용 <?php하고 있고 PHP 구성에서 짧은 오픈 태그를 해제 했는지 여부를 확인할 수도 있습니다 .

또한 PHP 코드가 실행되지 않고 페이지에 코드가 표시되는 것을 참조하십시오.


18

경고 : mysql_connect () : 사용자 'name'@ 'host'에 대한 액세스가 거부되었습니다.

이 경고는 유효하지 않거나 누락 된 자격 증명 (사용자 이름 / 암호)으로 MySQL / MariaDB 서버에 연결할 때 나타납니다. 그래서이 일반적으로 없는 코드 문제지만, 서버 구성 문제.

  • mysql_connect("localhost", "user", "pw")예제 는 매뉴얼 페이지를 참조하십시오 .

  • 실제로 a $username및을 사용했는지 확인하십시오 $password.

    • 암호를 사용하지 않고 액세스하는 것은 드문 일입니다 (using password: NO). 이는 경고 :가 발생했을 때의 일 입니다.
    • 로컬 테스트 서버 만 일반적으로 username root, 비밀번호 없음 및 test데이터베이스 이름 으로 연결할 수 있습니다 .

    • 커맨드 라인 클라이언트를 사용하여 실제로 올바른지 테스트 할 수 있습니다 .
      mysql --user="username" --password="password" testdb

    • 사용자 이름과 비밀번호는 대소 문자를 구분 하며 공백은 무시 되지 않습니다 . 비밀번호에와 같은 메타 문자가 포함되어 있으면 $이스케이프하거나 작은 따옴표로 묶으십시오 .

    • 대부분의 공유 호스팅 공급자는 유닉스 사용자 계정과 관련하여 mysql 계정을 미리 선언합니다 (때로는 접두사 또는 추가 숫자 접미사 만 있음). 패턴 또는 문서, CPanel 또는 비밀번호 설정을위한 인터페이스는 문서를 참조하십시오.

    • 명령 행을 사용하여 사용자 계정 추가 에 대한 MySQL 매뉴얼을 참조하십시오 . 관리자로 연결 하면 다음과 같은 쿼리를 실행할 수 있습니다.
      CREATE USER 'username'@'localhost' IDENTIFIED BY 'newpassword';

    • 또는 관리자 또는 WorkBench 또는 기타 그래픽 도구를 사용하여 계정 세부 정보를 작성, 확인 또는 수정하십시오.

    • 자격 증명을 수정할 수없는 경우 인터넷에 "도움을 요청하십시오"라고 요청해도 효과가 없습니다. 귀하와 호스팅 제공 업체 만 사물을 진단하고 수정할 수있는 권한과 충분한 액세스 권한이 있습니다.

  • 제공자가 제공 한 호스트 이름을 사용하여 데이터베이스 서버에 도달 있는지 확인하십시오 .
    ping dbserver.hoster.example.net

    • 웹 서버의 SSH 콘솔에서 직접 확인하십시오. 로컬 개발 클라이언트에서 공유 호스팅 서버로 테스트하는 것은 거의 의미가 없습니다.

    • 종종 서버 이름을 원합니다. "localhost"일반적으로 사용 가능한 경우 로컬 명명 된 소켓을 사용합니다. 다른 경우 "127.0.0.1"에는 폴백으로 시도 할 수 있습니다 .

    • MySQL / MariaDB 서버가 다른 포트에서 수신 대기하는 경우을 사용하십시오 "servername:3306".

    • 실패하면 방화벽 문제 일 수 있습니다. (토픽 외, 프로그래밍 질문이 아닙니다. 원격 추측 지원이 없습니다.)

  • 사용하는 경우 상수 예를 들어, 같은를 DB_USER하거나 DB_PASSWORD, 실제로하고 있는지 확인 정의 .

    • a "Warning: Access defined for 'DB_USER'@'host'"와 a 를 얻는다면 이것이 "Notice: use of undefined constant 'DB_PASS'"문제입니다.

    • 예를 들어 xy/db-config.php실제로 포함되어 있는지 확인하십시오 .

  • 올바르게 설정된 GRANT권한을 확인하십시오 .

    • username+ password쌍 을 갖는 것만으로는 충분하지 않습니다 .

    • 각 MySQL / MariaDB 계정에는 첨부 된 권한 세트가있을 수 있습니다.

    • 연결이 허용되는 데이터베이스, 연결이 시작된 클라이언트 / 서버 및 허용되는 쿼리를 제한 할 수 있습니다.

    • 따라서 특정 테이블 또는 / 및 더 일반적으로 mysql_query사용 권한이없는 경우 "액세스 거부"경고가 호출에 표시 될 수 있습니다 .SELECTINSERTUPDATEDELETE

    • 다음과 같은 쿼리로 관리자 계정 을 사용하여 명령 줄 클라이언트별로 연결될 때 계정 권한을 조정할 수 있습니다 .
      GRANT ALL ON yourdb.* TO 'username'@'localhost';

  • 경고가 먼저 나타나면 php.ini-pre-configured account / password pairWarning: mysql_query(): Access denied for user ''@'localhost' 가있을 수 있습니다 .

    • 그것을 확인 mysql.default_user=하고 mysql.default_password=의미있는 값이 있습니다.

    • 종종 이것은 공급자 구성입니다. 불일치에 대해서는 지원 부서에 문의하십시오.

  • 공유 호스팅 제공 업체의 설명서를 찾으십시오.

  • 사용 가능한 연결 풀이 고갈 되었을 수도 있습니다 . 너무 많은 동시 연결에 대한 액세스 거부 경고가 표시됩니다. (설정을 조사해야합니다. 프로그래밍 문제가 아닌 주제 이외의 서버 구성 문제입니다.)

  • libmysql 클라이언트 버전이 데이터베이스 서버와 호환되지 않을 수 있습니다 . 일반적으로 MySQL 및 MariaDB 서버는 드라이버로 컴파일 된 PHP로 도달 할 수 있습니다. 사용자 정의 설정 또는 오래된 PHP 버전, 훨씬 새로운 데이터베이스 서버 또는 상당히 오래된 데이터베이스 버전이있는 경우 버전이 일치하지 않으면 연결이되지 않을 수 있습니다. (아니요, 당신은 스스로 조사해야합니다. 아무도 당신의 설정을 추측 할 수 없습니다).

더 참조 :

Btw, mysql_*더 이상 함수 를 사용하고 싶지 않을 입니다. 신규 이민자들은 종종 mysqli 로 마이그레이션 하지만 지루합니다. 대신 PDO와 준비된 진술을 읽으십시오 .
$db = new PDO("mysql:host=localhost;dbname=testdb", "username", "password");


2
mysql은 php-ini 설정을 통한 자동 연결을 허용하고, "Warning : mysql_query () :에서 ''@ 'localhost'사용자의 액세스가 거부되었습니다. .. " -그냥 지적합니다.
hakre

하, 완전히 잊어 버렸습니다! (아마 마지막으로 PHP3와 함께 사용했습니다.)
mario

18

주의 사항 : 배열에서 문자열로의 변환

배열을 문자열로 취급하려고하면 간단히 발생합니다.

$arr = array('foo', 'bar');

echo $arr;  // Notice: Array to string conversion
$str = 'Something, ' . $arr;  // Notice: Array to string conversion

echo결과는 잘 정의되지 않았기 때문에 배열을 단순히 문자열로 연결하거나 연결할 수 없습니다 . PHP는 배열 대신 "Array"라는 문자열을 사용하며, 의도하지 않았으며 여기서 코드를 확인해야 함을 알리기 위해 알림을 트리거합니다. 대신 다음과 같은 것을 원할 것입니다.

echo $arr[0];  // displays foo
$str = 'Something ' . join(', ', $arr); //displays Something, foo, bar

또는 배열을 반복하십시오.

foreach($arr as $key => $value) {
    echo "array $key = $value";
    // displays first: array 0 = foo
    // displays next:  array 1 = bar
}

이 알림이 예상치 못한 곳에 나타나면 문자열이라고 생각되는 변수가 실제로 배열임을 의미합니다. 즉, 코드에 버그가 있어이 변수를 원하는 문자열 대신 배열로 만듭니다.


12

경고 : 0으로 나누기

경고 메시지 '0으로 나누기'는 새로운 PHP 개발자들 사이에서 가장 자주 묻는 질문 중 하나입니다. 이 오류는 예외를 발생시키지 않으므로 일부 개발자는 때때로 표현식 앞에 오류 억제 연산자 @를 추가하여 경고를 표시하지 않습니다. 예를 들면 다음과 같습니다.

$value = @(2 / 0);

그러나 다른 경고와 마찬가지로 가장 좋은 방법은 경고의 원인을 추적하고 해결하는 것입니다. 경고의 원인은 결과가 '정의되지 않음'으로 인해 0으로 나누려고 시도하는 인스턴스, 0과 같은 변수 또는 할당되지 않은 변수 (NULL == 0으로 인해)에서 발생합니다.

이 경고를 수정하려면 값이 0이 아닌지 확인하기 위해 식을 다시 작성해야합니다. 값이 0 인 경우 나누지 않아야하거나 값을 1로 변경 한 다음 나누면 추가 변수로만 나눈 것과 같은 결과가 나옵니다.

if ( $var1 == 0 ) { // check if var1 equals zero
    $var1 = 1; // var1 equaled zero so change var1 to equal one instead
    $var3 = ($var2 / $var1); // divide var1/var2 ie. 1/1
} else {
    $var3 = ($var2 / $var1); // if var1 does not equal zero, divide
}

관련 질문 :


0 인 경우 1로 설정하면 오류가 중지되지만 사용하지 말아야 할 억제보다 더 나은가? 대부분의 경우 다른 메시지 또는 값이 반환 될 수 있다고 제안합니다.
James

이 예제에서 $var1does == 0이면로 설정 $var3하면 $var2됩니다. 그렇게하지 않더라도 두 경우 모두 과제가 동일하므로 다른 것은 전혀 필요하지 않습니다.if
James

8

엄격한 표준 : 비 정적 메소드 [<class> :: <method>] 를 정적으로 호출하면 안됩니다.

정적 일 때 클래스에서 비 정적 메서드를 호출하려고 할 때 발생 E_STRICT하며 error_reporting()설정에 플래그가 있습니다 .

예 :

class HTML {
   public function br() {
      echo '<br>';
   }
}

HTML::br() 또는 $html::br()

당신은 실제로하지 추가하여이 오류를 방지 할 수 있습니다 E_STRICTerror_reporting(), 예를 들어,

error_reporting(E_ALL & ~E_STRICT);

PHP 5.4.0 이상 E_STRICTE_ALL[ ref ]에 포함되어 있습니다. 그러나 그것은 충고하지 않습니다. 해결책은 의도 한 정적 함수를 실제로 정의하는 것입니다 static.

public static function br() {
  echo '<br>';
}

또는 일반적으로 함수를 호출하십시오.

$html = new HTML();
$html->br();

관련 질문 :


7

더 이상 사용되지 않음 : 중괄호가있는 배열 및 문자열 오프셋 액세스 구문은 더 이상 사용되지 않습니다.

문자열 오프셋과 배열 요소는 {}PHP 7.4.0 이전의 중괄호로 액세스 할 수 있습니다 .

$string = 'abc';
echo $string{0};  // a

$array = [1, 2, 3];
echo $array{0};  // 1

이것은 PHP 7.4.0부터 더 이상 사용되지 않으며 경고를 생성합니다.

더 이상 사용되지 않음 : 중괄호가있는 배열 및 문자열 오프셋 액세스 구문은 더 이상 사용되지 않습니다.

[]문자열 오프셋 및 배열 요소에 액세스 하려면 대괄호 를 사용해야합니다 .

$string = 'abc';
echo $string[0];  // a

$array = [1, 2, 3];
echo $array[0];  // 1

이 변화에 대한 RFC 하는 PHP에 대한 링크 스크립트를 시도 기계적으로이 문제를 해결하기 위해.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.