2014-11-02 1 views
3

나는 게시물 슬러그가 'r1', 'r2', 'r3', 'bah1', 'bah2' , 'bah3'등이 있습니다. 첫 글자는 슬러그 카테고리이며, 숫자는 해당 카테고리의 글 수입니다.PHP를 사용하여 SQL 테이블에서 선택하고 결과에서 특정 접두사를 제거

내가 작성하려고하는 것은 포스트 슬러그 ('r'또는 'bah'를 PHP 문자열로 저장 한 다음 wp_posts에서 post_name을 선택하는 PHP 스크립트를 작성하여 숫자 만 출력하고 정렬하는 것입니다. 내림차순으로 게시물의 가장 높은 값을 얻으십시오.

기본적으로 어떻게 생각하니 PHP의 문자열 길이를 사용하여 결과의 ​​처음부터 문자 수를 차감하는 것이 좋습니다. SQL 검색에 PHP 문자열을 도입 할 때 특히 문제가 발생했습니다.

지금까지 오른쪽 슬러그가 포함 된 모든 게시물을 선택할 수있는 코드 만 있었지만 t를 제거하다 그가 접두사. 여기에 내가 가진 무엇 : 순간

$slug = 'r'; 
$con = @mysqli_connect("localhost","user","password","database"); 
$result = mysqli_query($con," 
select post_name from wp_posts    
    where post_name like '".$slug."%' 
    and post_type='post' 
order by post_name desc"); 

while ($row = mysqli_fetch_array($result)) { 
    echo $row['post_name'] . ' '; 
} 

, 출력이 예상된다 :

R9 R8 R7 R63 R62 R61 R60 R6 R59 R58 R57 R56 r55 r54

SQL 이후 "정확하게"분류하지 않고 r6을 r61보다 작은 숫자로 봅니다. 그것이 결과에서 'r'을 제거하여 더 잘 정렬 할 수있는 이유 중 일부입니다.

의견이 있으십니까?

+0

지금까지 무엇을했는지 보여주세요! 어떤 쿼리를 시도 했습니까? PHP 측에서 어떻게합니까? – wolfgangwalther

+0

지금까지는 적절한 것이 없습니다. '$ slug = 'r'; $ con = @mysqli_connect ("localhost", "myuser", "mypass", "mydatabase"); $는 = mysqli_query 결과 ($ 사기꾼, "wp_posts 에서 선택 POST_NAME 어디 POST_NAME 같은 '"$ 슬러그 "%..' 및 post_type = '포스트'POST_NAME 내림차순 BY ORDER"); 난 무엇' 찾고있는 것은 결과를 정리하여 각 결과의 처음부터 $ slug를 제거하는 것입니다. –

+0

글쎄, 그거 좋은 시작이야. 귀하는 귀하의 질문에 코드를 추가하여보다 쉽게 ​​읽고 더 가치있게 할 수 있습니다! – wolfgangwalther

답변

2

여기에 간단한 패턴이 있습니다. 일부 숫자 뒤에 일부 문자가 오는 문자입니다./\ D + (\ d +) /와 같은 정규 표현식을 파싱하는 것은 매우 쉽습니다. 역 참조와 PHP preg_replace 함수로 대체하여 이전의 모든 비 숫자 문자를 제거합니다. 예 :

<?php 
$num = preg_replace('/\D+(\d+)/', '$1', 'r12'); 
$num1 = preg_replace('/\D+(\d+)/', '$1', 'bah4'); 
$num2 = preg_replace('/\D+(\d+)/', '$1', 'bah38'); 


echo $num . "\n"; 
echo $num1 . "\n"; 
echo $num2 . "\n"; 

그래서이처럼 while 루프에서이 작업을 수행 할 수는 :

while ($row = mysqli_fetch_array($result)) { 
    $stripped[] = preg_replace('/\D+(\d+)/', '$1', $row['post_name']); 
} 

는 그런 다음 결과 배열을 정렬 PHP sort 기능을 사용할 수 있습니다.

+0

이것은 훌륭한 해결책입니다. 나는 SQL 쿼리 이후에 문자열을 제거하는 것을 결코 고려하지 않았습니다. 물론 문제는 내림차순으로 물건을 넣을 때 SQL 정렬 알고리즘이 모든 것을 잘못된 순서로 놓는다는 것입니다. 9, 8, 7, 6, 5, 4, 3, 2, 18, 17, 16, 15,14,13,12,11,10,1. 그래도이 방법으로 배열을 만든 후에는 배열을 rsort 할 수 있습니다. 내가 속이고있는 것처럼 느껴지지만 절대적으로 효과가 있습니다. –

+0

@BrekiTomasson 왜 안 되니? 문자열 조작을위한 PHP에는 많은 도구가 있습니다. 또한, 들었을 때 (제발, 만약 그것이 옳지 않다면), MySQL에는 정규 표현식 대체가 없습니다. – a1111exe

0

필요한 것은 mysql 함수 SUBSTRING (MySQL manual)입니다. 나중에 CAST (MySQL manual)을 사용하여 그 결과를 정수로 변환하면 나중에 정렬 할 수 있습니다.

당신의 SQL 쿼리는 다음과 같이 수 :

SELECT post_name, CAST(SUBSTRING(post_name FROM x+1) AS UNSIGNED) AS post_number 
FROM wp_posts 
WHERE 
    post_name LIKE '".$slug."%' AND 
    post_type='post' 
ORDER BY post_number DESC 

이 문자열의 길이 x를 교체합니다.

mysqli와 함께 준비된 문장을 사용하는 것도 고려해야합니다. 이에 대한 자세한 내용은 How can I prevent SQL injection in PHP?을 참조하십시오!

+0

그래, 그게 나에게 "오류 : SQL 구문에 오류가있어, 올바른 구문이 'INTEGER'근처에서 사용하도록 MySQL 서버 버전에 해당하는 설명서를 확인하십시오. post_number FROM wp_posts where post_name like 'r %' 그리고 post_typ 'at line 1'. PHP에서 문자열의 길이를 정확하게 쿼리에 넣지 않을 수 있습니까? –

+0

죄송합니다. 제 잘못 : INTEGER 대신 UNSIGNED를 사용하십시오. 내 대답을 바로 잡았어. – wolfgangwalther

+0

지금과 같이 작동합니까? – wolfgangwalther

관련 문제