찾다

 >  Q&A  >  본문

PHP에서 데이터베이스 간 쿼리를 작성하는 방법은 무엇입니까?

지난 에피소드(MySQL에서 데이터베이스 간 쿼리를 작성하는 방법)에서는 MySQL에서 데이터베이스 간 쿼리를 작성하는 방법을 배웠습니다. 이것은 훌륭하게 작동했지만, 우리의 영웅이 PHP에서 이 새로운 지식을 사용하려고 시도했을 때 그는 그의 가장 친한 친구가 실패했다는 것을 발견했습니다.

PHP를 살펴봤습니다mysql_select_db . 이는 PHP와 함께 MySQL을 사용하려는 경우 몇 가지 옵션이 있다는 것을 의미하는 것 같습니다.

  1. mysql_select_db을 사용하지만 한 번에 하나의 데이터베이스만 사용할 수 있습니다. 이것이 우리의 현재 설정인데, 데이터베이스를 네임스페이스 식별자로 갖는 것이 작동하지 않는 것 같습니다(MySQL 셸에서는 잘 작동하므로 MySQL 서버 설정에는 문제가 되지 않는다는 것을 알고 있습니다).

  2. mysql_select_db。从我看到的一些示例来看,这似乎意味着我必须为我所做的每个查询指定数据库。这是有道理的,因为我没有使用 mysql_select_db를 사용하지 마세요. 내가 본 몇 가지 예에 따르면 이는 내가 만드는 모든 쿼리에 대해 데이터베이스를 지정해야 한다는 의미인 것 같습니다. 내가 액세스하려는 데이터베이스를 PHP에 알리기 위해

    를 사용하지 않기 때문에 이는 의미가 있습니다. 모든 코드를 살펴보고 각 쿼리 앞에 데이터베이스 이름을 추가하고 싶지 않기 때문에 이것은 또한 슬픈 일입니다.

이보다 더 좋은 게 있을까요? (2)와 같은 이상한 작업을 수행하지 않고도 PHP에서 데이터베이스 간 MySQL 쿼리를 수행할 수 있는 방법이 있습니까?

설명SELECTforeign_db.login.username,firstname,lastname fromforeign_db.login,user where...: 제안된 답변 중 실제로 데이터베이스 간 쿼리를 수행할 수 있는 답변은 없습니다. 대신, 두 개의 서로 다른 데이터베이스에 개별적으로 액세스할 수 있습니다. 저는 단순히 다른 데이터베이스에 대해 다른 쿼리를 수행하는 대신

과 같은 작업을 수행할 수 있는 솔루션을 원합니다. 그만한 가치가 있기 때문에 (2)는 나에게 적합하지 않습니다. 🎜
P粉197639753P粉197639753433일 전708

모든 응답(2)나는 대답할 것이다

  • P粉077701708

    P粉0777017082023-10-23 11:15:52

    귀하의 지침을 읽은 후, 저는 귀하가 실제로 두 개의 별도 MySQL 서버 인스턴스에 있는 테이블을 쿼리하고 싶어한다는 인상을 받았습니다. 적어도 명확한 텍스트는 다음과 같습니다.

    두 명의 사용자(동일한 mysql 서버 인스턴스에 상주할 수도 있고 상주하지 않을 수도 있음)로 로그인한 동안 쿼리를 실행하는 것이 좋습니다.

    질문에서 서로 다른 두 데이터베이스의 데이터를 쿼리하고 싶다고 하셨지만 MySQL 인스턴스에는 매우 많은 데이터베이스가 포함될 수 있다는 점을 인식하는 것이 중요합니다. 동일한 mysql 인스턴스로 관리되는 여러 데이터베이스의 경우 연결된 질문에서 제안된 솔루션은 간단합니다. 테이블 이름 앞에 데이터베이스 이름 접두사를 붙이고 데이터베이스와 테이블 이름을 점으로 구분하면 됩니다. .<表名>.

    하지만 앞서 지적했듯이 다음과 같은 경우에만 작동합니다.

    1. 쿼리에서 액세스하는 모든 데이터베이스는 동일한 서버에 있습니다. 즉, 동일한 MySQL 인스턴스에서 관리됩니다.
    2. 데이터베이스에 연결된 사용자는 두 테이블 모두에 액세스할 수 있는 올바른 권한을 가지고 있습니다.

    시나리오 1: 동일한 호스트의 데이터베이스: 적절한 권한을 부여하고 테이블 이름을 한정합니다

    따라서 테이블이 실제로 동일한 mysql 인스턴스에 있는 경우 두 번째 로그인이나 연결이 필요하지 않습니다. 데이터베이스에 연결하는 데 사용하는 데이터베이스 사용자에게 Select from에서 필요한 모든 테이블을 가져올 수 있는 적절한 권한을 부여하기만 하면 됩니다. 여기에 문서화된 GRANT 구문을 사용하여 이를 수행할 수 있습니다: http://dev.mysql.com/doc/refman/5.1/en/grant.html

    예를 들어 GRANT SELECT ON sakila.film TO 'test'@'%' 将允许用户 test@%film 选择数据sakila 数据库中的 表。完成此操作后,用户可以使用 sakila.film(所谓的限定表名)引用该表,或者如果当前数据库设置为 sakila,只需如下所示电影

    시나리오 2: 다양한 MySQL 인스턴스로 관리되는 데이터베이스: FEDERATED 엔진

    액세스하려는 테이블이 실제로 두 개의 서로 다른 MySQL 인스턴스에 의해 관리되는 경우 구성에 따라 작동할 수도 있고 작동하지 않을 수도 있는 트릭이 있습니다. MySQL 5.0부터 mysql은 FEDERATED 스토리지 엔진을 지원합니다. 이를 통해 실제로는 테이블이 아니지만 원격 서버의 테이블을 엿볼 수 있는 테이블을 만들 수 있습니다. 엔진은 여기에 문서화되어 있습니다: http://dev.mysql.com/doc/refman/5.1/en/federated-storage-engine.html

    예를 들어, 원격 호스트의 misc 데이터베이스에 다음 테이블이 있다는 것을 알고 있는 경우:

    으아악

    다음을 사용하여 원격 테이블에 대한 로컬 "포인터"를 만들 수 있습니다.

    으아아아

    안타깝게도 FEDERATED 엔진이 항상 사용 가능한 것은 아니므로, 사용 가능 여부를 먼저 확인하셔야 합니다. 그러나 이것이 사실이라고 가정하면 다른 테이블과 마찬가지로 쿼리에서 로컬 테이블 t를 간단히 사용할 수 있으며 MySQL은 원격 서버와 통신하고 반대편의 물리적 테이블에서 적절한 작업을 수행합니다.

    경고: FEDERATED 테이블에는 여러 가지 최적화 문제가 있습니다. 귀하는 이러한 사항이 귀하에게 적용되는지 여부와 어느 정도까지 적용되는지 이해해야 합니다. 예를 들어, 많은 경우 통합 테이블에 WHERE를 적용하면 전체 테이블 내용이 네트워크를 통해 실제 필터링이 적용되는 로컬 서버로 풀링될 수 있습니다. 또 다른 문제는 테이블 생성입니다. ENGINE 절(및 CONNECTION)을 제외하고 통합 테이블과 그것이 가리키는 테이블의 정의가 정확히 일치하는지 확인해야 합니다. 예를 들어, 서로 다른 문자 세트가 있는 경우 네트워크를 통해 전송된 후 데이터가 완전히 왜곡될 수 있습니다.

    테이블 FEDERATED을 사용하려면 이 문서 http://oreilly.com/pub/a/databases/2006/08/10/mysql-federated-tables.html을 읽고 귀하의 용도에 적합한지 결정하세요. 특정 사용 사례.

    정말 필요하다고 생각하시면 여기에 통합 테이블을 생성할 수 있는 유틸리티가 있습니다: http://forge.mysql.com/tools/tool.php?id=54

    시나리오 3: FEDERATED를 사용할 수 없지만 테이블이 다른 MySQL 인스턴스에 있습니다

    마지막으로, 다른 MySQL 인스턴스에 테이블이 있지만 어떤 이유로 페더레이션 테이블 엔진을 사용할 수 없다면 운이 없는 것입니다. 두 개의 MySQL 인스턴스에 대해 쿼리를 실행하고, 결과를 받고, PHP에서 몇 가지 스마트한 작업을 수행하기만 하면 됩니다. 특정 요구 사항에 따라 이는 완벽하게 실행 가능한 솔루션이 될 수 있습니다

    내 답변 중 어느 부분이 문제를 가장 잘 해결하는지 스스로 결정하고 도움이 더 필요할 경우 댓글을 추가해야 할 것 같습니다. 티아 로렌.

    회신하다
    0
  • P粉481366803

    P粉4813668032023-10-23 10:00:37

    동일한 호스트에서 실행되려면 데이터베이스가 필요합니다.

    그렇다면 즐겨찾는/기본 데이터베이스에서 mysql_select_db를 사용하고 외부 데이터베이스를 수동으로 지정할 수 있어야 합니다.

    으아아아

    데이터베이스가 다른 호스트에서 실행 중인 경우 직접 참여할 수 없습니다. 하지만 그러면 2개의 쿼리를 수행할 수 있습니다.

    으아아아

    회신하다
    0
  • 취소회신하다