2015-01-07 3 views
1

매우 모호한 제목에 대해 사과 드리며 여기에서 사용하는 정확한 용어에 대해서는 확신 할 수 없습니다.PHP : 중첩 된 변수 문제

저는 현재 연도의 변수를 저장하기 위해 PHP를 작성한 다음 현재 연도에서 4 (4 년 전)를 저장하는 다른 변수를 작성했습니다. 어쩌면이 할 수있는 더 효율적인 방법이 있지만 따라서, 1월 1일이

// Get current date 
$date = date_create('now'); 

// Store two digit version of current year 
$yearnow = date_format($date, 'y') . "-01-01"; 

// Reduce the year count by two 
$yearminusfour = $yearnow - 4 . "-01-01"; 

없음 문제를 추가 내가 일년 내내이 원하는 할 메모로서. 그러나 저는 이것을 사용하여 WordPress의 지난 4 년 동안의 게시물을 동적으로 가져 왔습니다.

$where .= " AND post_date >= '2010-01-01' AND post_date < '2014-01-01'"; 

은 내가 두 가지를 결합한다와 사투를 벌인거야 그것은 동적으로 만들기 위해 :

권리 게시물을 반환에 대한 책임의 코드 행 정적 때 잘 작동합니다. 나는 시도했다 :

$where .= " AND post_date >= $yearnow AND post_date < $yearminusfour"; 
$where .= " AND post_date >= '.$yearnow.' AND post_date < '.$yearminusfour.'"; 
$where .= " AND post_date >= '".$twentyten."' AND post_date < '".$yearminusfour."'"; 

나는 걸렸다. 그리고 나는 느리고있다라고 확신한다.

+1

당신이 연결 점을 넣어 :' ' '''(예 :' ' ".) – Rizier123

+0

3 번째 구문은 훌륭합니다 ($ twenteen은 $ yearnow가되어야합니다). 처음 2 명은 나쁘다. 날짜는 작은 따옴표로 묶어야하며, 둘째 점은'.'이 필요하지 않습니다. – vaso123

+1

아시다시피 PDO와 매개 변수 바인딩에 대해 읽으실 수 있습니다. – mario

답변

1
$where .= " AND post_date >= '$yearnow' AND post_date < '$yearminusfour'"; 

올바른 버전입니다. 그 기간은 필요 없습니다.

하지만 스스로 알고 있습니다. 이것은 불필요하게 복잡한 날짜 계산으로 잘못된 값을 초래합니다. 당신은 예를 들어이 작동

echo date("Y-m-d",strtotime("1st January this year")); // 2015-01-01 

How can I prevent SQL injection in PHP?

1
$where .= " AND post_date >= '".$twentyten."' AND post_date < '".$yearminusfour."'"; 

를 사용하여이 올해의 첫 데이트를 얻을 수 있지만 비교 : 또한

$where .= " AND post_date <= '".$twentyten."' AND post_date >= '".$yearminusfour."'"; 

역 할, 당신은 사용해야합니다 준비된 진술. 사용자 입력을 사용할 때 권장됩니다.

+0

되돌리기 또는 되돌리기? –

+0

둘 다 정확합니다. –

+1

되돌리기 : 이전 버전으로 되돌립니다. Reverse : 순서를 바꿉니다. 나는 OP가 다른 순서로 시작하지 않았기 때문에 역이 올바르다 고 생각한다 : P –

0

나는 당신이 찾고있는 범위가 실현 가능하지 않다고 생각한다. 게시 한 코드에 따르면, 4 년 전의 게시물> = 현재 연도 및 날짜 미만을 검색합니다. 따라서 비교를 변경해야합니다.

$where .= " AND post_date <= '".$twentyten."' AND post_date > '".$yearminusfour."'"; 
0

$ yearnow는 2015-01-01과 비슷합니다. 그렇다면 $yearnow-4은 무엇이 될까요?
어쨌든, 당신은 사용할 수 있습니다하여 manipulations 필요한 수행하기 위해 (이미 별칭 date_create를 사용하는의) DateTime class :

<?php 
$date = new DateTime('first day of January'); 


$clause = sprintf('WHERE x BETWEEN %s AND %s', 
    $date->format('Y-m-d'), 
    $date->modify('- 4 year')->format('Y-m-d') 
); 

echo $clause; 

인쇄 (올해)

WHERE x BETWEEN 2015-01-01 AND 2011-01-01 
+0

DATE_SUB와 같은 SQL 함수가 왜 안되는가? –

+0

Ah , 당신은 절대적으로 옳았습니다. 제 코드를 바 꾸었습니다. 이제는 말이되지 않습니다. 이전에 각 변수를 -01-01을 추가하기 전의 일년으로 설정 한 다음 나중에 날짜를 추가했습니다. 단순화하려고했지만 분명히 망 쳤어! 나는 너에게 해답을 줄 것이다. – lotech

+0

로얄 Bg, 왜냐하면 wordpress는 MySQL과 함께 사용되지 않기 때문에 그 영향은 실제 질문에서 훨씬 더 벗어나기에 충분하지 않습니다 ;-) – VolkerK

0
내가 사용하는 것이 좋습니다 것

mysql (mysql을 사용한다고 가정)과 날짜 빼기 조건.

$where .= " AND post_date BETWEEN '$yearnow' AND '$yearnow' - INTERVAL 4 YEAR"; 
+0

WordPress + MySQL은 거의 거의 주어진 것입니다. -) – VolkerK

0

방법에 대해 : 다음과 같이 표시됩니다

?

$yearStart = date('Y-m-d', strtotime('Jan 01')); 
$yearEnd = date('Y-m-d',strtotime("$yearStart -4 year")); 

$where .= "AND (date_field BETWEEN '".$yearStart."' AND '".$yearEnd."')"; 
+0

내 문제가 더 심각하게 진행되는지 지금 궁금해하고 있지만 이것이 나에게 도움이되지 않는 것 같습니다. 그러나 고정 날짜를 사용하면 원래 코드가 제대로 작동합니다. $ where. = "AND post_date> ="2010-01-01 "AND post_date < '2014-01-01'"; – lotech

0

1) 날짜 시도 효율적으로 활용하려면 다음

$currentdate = date('Y-m-d',time()); 
$yearminus4 = date('Y-m-d',strtotime("-4 years", time())); 

2) 나는 당신이 당신의 SQL 문에 뒤로 당신의 선택 기준이 생각

$where = " AND post_date >= '" . $yearminus4 . "' 
      AND post_date <= '" . $currentdate . "'";